aboutsummaryrefslogtreecommitdiff
path: root/bin/src/config.rs
diff options
context:
space:
mode:
Diffstat (limited to 'bin/src/config.rs')
-rw-r--r--bin/src/config.rs78
1 files changed, 60 insertions, 18 deletions
diff --git a/bin/src/config.rs b/bin/src/config.rs
index f2cf29d..077f73e 100644
--- a/bin/src/config.rs
+++ b/bin/src/config.rs
@@ -1,7 +1,12 @@
1use std::{default::Default, fs, path::PathBuf, str::FromStr}; 1use std::{
2 default::Default,
3 fs, io,
4 path::{Path, PathBuf},
5 str::FromStr,
6};
2 7
3use clap::Clap; 8use clap::Clap;
4use globset::{GlobBuilder, GlobSetBuilder}; 9use globset::{Error as GlobError, GlobBuilder, GlobSet, GlobSetBuilder};
5use vfs::ReadOnlyVfs; 10use vfs::ReadOnlyVfs;
6 11
7use crate::err::ConfigErr; 12use crate::err::ConfigErr;
@@ -77,25 +82,14 @@ pub struct LintConfig {
77 82
78impl LintConfig { 83impl LintConfig {
79 pub fn from_opts(opts: Opts) -> Result<Self, ConfigErr> { 84 pub fn from_opts(opts: Opts) -> Result<Self, ConfigErr> {
80 let ignores = { 85 let ignores = build_ignore_set(&opts.ignore).map_err(|err| {
81 let mut set = GlobSetBuilder::new(); 86 ConfigErr::InvalidGlob(err.glob().map(|i| i.to_owned()), err.kind().clone())
82 for pattern in opts.ignore { 87 })?;
83 let glob = GlobBuilder::new(&pattern).build().map_err(|err| {
84 ConfigErr::InvalidGlob(err.glob().map(|i| i.to_owned()), err.kind().clone())
85 })?;
86 set.add(glob);
87 }
88 set.build().map_err(|err| {
89 ConfigErr::InvalidGlob(err.glob().map(|i| i.to_owned()), err.kind().clone())
90 })
91 }?;
92
93 let walker = dirs::Walker::new(opts.target).map_err(ConfigErr::InvalidPath)?;
94 88
95 let files = walker 89 let files = walk_nix_files(&opts.target)?
96 .filter(|path| matches!(path.extension(), Some(e) if e == "nix"))
97 .filter(|path| !ignores.is_match(path)) 90 .filter(|path| !ignores.is_match(path))
98 .collect(); 91 .collect();
92
99 Ok(Self { 93 Ok(Self {
100 files, 94 files,
101 format: opts.format.unwrap_or_default(), 95 format: opts.format.unwrap_or_default(),
@@ -113,6 +107,40 @@ impl LintConfig {
113 } 107 }
114} 108}
115 109
110pub struct FixConfig {
111 pub files: Vec<PathBuf>,
112 pub diff_only: bool,
113}
114
115impl FixConfig {
116 pub fn from_opts(opts: Opts) -> Result<Self, ConfigErr> {
117 let ignores = build_ignore_set(&opts.ignore).map_err(|err| {
118 ConfigErr::InvalidGlob(err.glob().map(|i| i.to_owned()), err.kind().clone())
119 })?;
120
121 let files = walk_nix_files(&opts.target)?
122 .filter(|path| !ignores.is_match(path))
123 .collect();
124
125 let diff_only = match opts.subcmd {
126 Some(SubCommand::Fix(f)) => f.diff_only,
127 _ => false,
128 };
129
130 Ok(Self { files, diff_only })
131 }
132
133 pub fn vfs(&self) -> Result<ReadOnlyVfs, ConfigErr> {
134 let mut vfs = ReadOnlyVfs::default();
135 for file in self.files.iter() {
136 let _id = vfs.alloc_file_id(&file);
137 let data = fs::read_to_string(&file).map_err(ConfigErr::InvalidPath)?;
138 vfs.set_file_contents(&file, data.as_bytes());
139 }
140 Ok(vfs)
141 }
142}
143
116mod dirs { 144mod dirs {
117 use std::{ 145 use std::{
118 fs, 146 fs,
@@ -168,3 +196,17 @@ mod dirs {
168 } 196 }
169 } 197 }
170} 198}
199
200fn build_ignore_set(ignores: &Vec<String>) -> Result<GlobSet, GlobError> {
201 let mut set = GlobSetBuilder::new();
202 for pattern in ignores {
203 let glob = GlobBuilder::new(&pattern).build()?;
204 set.add(glob);
205 }
206 set.build()
207}
208
209fn walk_nix_files<P: AsRef<Path>>(target: P) -> Result<impl Iterator<Item = PathBuf>, io::Error> {
210 let walker = dirs::Walker::new(target)?;
211 Ok(walker.filter(|path: &PathBuf| matches!(path.extension(), Some(e) if e == "nix")))
212}