1
Fork 0
mirror of https://github.com/RGBCube/alejandra synced 2025-07-30 12:07:46 +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::Config;
use crate::config::Indentation;
#[derive(PartialEq)] #[derive(PartialEq)]
pub(crate) enum Step { pub(crate) enum Step {
@ -15,14 +16,13 @@ pub(crate) enum Step {
#[derive(Clone)] #[derive(Clone)]
pub(crate) struct BuildCtx { pub(crate) struct BuildCtx {
pub _config: Config, pub config: Config,
pub force_wide: bool, pub force_wide: bool,
pub force_wide_success: bool, pub force_wide_success: bool,
pub indentation: usize, pub indentation: usize,
pub pos_old: crate::position::Position, pub pos_old: crate::position::Position,
pub path: String, pub path: String,
pub vertical: bool, pub vertical: bool,
pub indent: String,
} }
pub(crate) fn build( pub(crate) fn build(
@ -100,7 +100,12 @@ fn build_step(
add_token( add_token(
builder, builder,
rnix::SyntaxKind::TOKEN_WHITESPACE, 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 /// Configuration used by the formatter
#[derive(Clone, Copy, Default, Deserialize)] #[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 { let mut build_ctx = crate::builder::BuildCtx {
_config: config, config,
force_wide: false, force_wide: false,
force_wide_success: true, force_wide_success: true,
indentation: 0, indentation: 0,
path, path,
pos_old: crate::position::Position::default(), pos_old: crate::position::Position::default(),
vertical: true, vertical: true,
indent,
}; };
let after = crate::builder::build(&mut build_ctx, ast.node().into()) let after = crate::builder::build(&mut build_ctx, ast.node().into())

View file

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