1
Fork 0
mirror of https://github.com/RGBCube/alejandra synced 2025-07-29 19:47:45 +00:00

feat: rebase Vladimir's pr

This commit is contained in:
Kevin Amado 2024-11-23 14:39:03 -07:00
parent d961847646
commit ac93a779e7
84 changed files with 48 additions and 20 deletions

View file

@ -1,4 +1,5 @@
use crate::config::Config;
use crate::config::Indentation;
#[derive(PartialEq)]
pub(crate) enum Step {
@ -15,14 +16,13 @@ pub(crate) enum Step {
#[derive(Clone)]
pub(crate) struct BuildCtx {
pub _config: Config,
pub config: Config,
pub force_wide: bool,
pub force_wide_success: bool,
pub indentation: usize,
pub pos_old: crate::position::Position,
pub path: String,
pub vertical: bool,
pub indent: String,
}
pub(crate) fn build(
@ -100,7 +100,12 @@ fn build_step(
add_token(
builder,
rnix::SyntaxKind::TOKEN_WHITESPACE,
&build_ctx.indent.repeat(build_ctx.indentation),
&match build_ctx.config.indentation {
Indentation::FourSpaces => " ",
Indentation::Tabs => "\t",
Indentation::TwoSpaces => " ",
}
.repeat(build_ctx.indentation),
);
}
}

View file

@ -2,4 +2,19 @@ use serde::Deserialize;
/// Configuration used by the formatter
#[derive(Clone, Copy, Default, Deserialize)]
pub struct Config {}
pub struct Config {
/// Indentation to use
pub indentation: Indentation,
}
#[derive(Clone, Copy, Default, Deserialize)]
/// Indentation options
pub enum Indentation {
/// Four spaces
FourSpaces,
/// Tabs
Tabs,
#[default]
/// Two spaces
TwoSpaces,
}

View file

@ -32,14 +32,13 @@ pub fn in_memory(
}
let mut build_ctx = crate::builder::BuildCtx {
_config: config,
config,
force_wide: false,
force_wide_success: true,
indentation: 0,
path,
pos_old: crate::position::Position::default(),
vertical: true,
indent,
};
let after = crate::builder::build(&mut build_ctx, ast.node().into())

View file

@ -1,32 +1,40 @@
use std::collections::HashMap;
use std::collections::HashSet;
use std::io::Write;
use alejandra::config::Config;
use alejandra::config::Indentation;
use pretty_assertions::assert_eq;
#[test]
fn cases() {
let should_update = std::env::var("UPDATE").is_ok();
let cases: HashSet<String> = std::fs::read_dir("tests/cases")
.unwrap()
.map(|entry| entry.unwrap().file_name().into_string().unwrap())
.collect();
let configs = HashMap::from([
("default", Config::default()),
("indentation-tabs", Config {
indentation: Indentation::Tabs,
..Default::default()
}),
]);
let configs = HashMap::from([("", Config::default())]);
for (config_name, config) in configs {
let cases: Vec<String> =
std::fs::read_dir(format!("tests/cases/{}", config_name))
.unwrap()
.map(|entry| entry.unwrap().file_name().into_string().unwrap())
.collect();
for case in cases {
let path_in = format!("tests/cases/{}/in.nix", case);
let content_in = std::fs::read_to_string(path_in.clone()).unwrap();
for case in cases {
let path_in =
format!("tests/cases/{}/{}/in.nix", config_name, case);
let content_in = std::fs::read_to_string(&path_in).unwrap();
for (config_name, config) in &configs {
let path_out =
format!("tests/cases/{}/out{}.nix", case, config_name);
format!("tests/cases/{}/{}/out.nix", config_name, case);
let content_got = alejandra::format::in_memory(
path_in.clone(),
content_in.clone(),
config.clone(),
config,
)
.1;
@ -42,8 +50,9 @@ fn cases() {
assert_eq!(
content_out, content_got,
"Test case `{case}` failed; see \
`src/alejandra/tests/cases/{case}/`"
"Test case `{}/{}` failed; see \
`src/alejandra/tests/cases/{}/{}/`",
config_name, case, config_name, case,
);
}
}