Răsfoiți Sursa

Workspace support for `dx fmt` (#2745)

Matt Hunzinger 11 luni în urmă
părinte
comite
ef0202f999
1 a modificat fișierele cu 43 adăugiri și 19 ștergeri
  1. 43 19
      packages/cli/src/cli/autoformat.rs

+ 43 - 19
packages/cli/src/cli/autoformat.rs

@@ -1,8 +1,9 @@
+use super::*;
+use crate::DioxusCrate;
+use build::TargetArgs;
 use dioxus_autofmt::{IndentOptions, IndentType};
 use rayon::prelude::*;
-use std::{fs, path::Path, process::exit};
-
-use super::*;
+use std::{borrow::Cow, fs, path::Path, process::exit};
 
 // For reference, the rustfmt main.rs file
 // https://github.com/rust-lang/rustfmt/blob/master/src/bin/main.rs
@@ -30,6 +31,10 @@ pub struct Autoformat {
     /// Split attributes in lines or not
     #[clap(short, long, default_value = "false")]
     pub split_line_attributes: bool,
+
+    /// The package to build
+    #[clap(short, long)]
+    pub package: Option<String>,
 }
 
 impl Autoformat {
@@ -43,15 +48,11 @@ impl Autoformat {
             ..
         } = self;
 
-        // Default to formatting the project
-        if raw.is_none() && file.is_none() {
-            if let Err(e) = autoformat_project(check, split_line_attributes, format_rust_code) {
-                eprintln!("error formatting project: {}", e);
-                exit(1);
-            }
-        }
-
-        if let Some(raw) = raw {
+        if let Some(file) = file {
+            // Format a single file
+            refactor_file(file, split_line_attributes, format_rust_code)?;
+        } else if let Some(raw) = raw {
+            // Format raw text.
             let indent = indentation_for(".", self.split_line_attributes)?;
             if let Some(inner) = dioxus_autofmt::fmt_block(&raw, 0, indent) {
                 println!("{}", inner);
@@ -60,11 +61,32 @@ impl Autoformat {
                 eprintln!("error formatting codeblock");
                 exit(1);
             }
-        }
+        } else {
+            // Default to formatting the project.
+            let crate_dir = if let Some(package) = self.package {
+                // TODO (matt): Do we need to use the entire `DioxusCrate` here?
+                let target_args = TargetArgs {
+                    package: Some(package),
+                    ..Default::default()
+                };
+                let dx_crate = match DioxusCrate::new(&target_args) {
+                    Ok(x) => x,
+                    Err(error) => {
+                        eprintln!("failed to parse crate graph: {error}");
+                        exit(1);
+                    }
+                };
+                Cow::Owned(dx_crate.crate_dir())
+            } else {
+                Cow::Borrowed(Path::new("."))
+            };
 
-        // Format single file
-        if let Some(file) = file {
-            refactor_file(file, split_line_attributes, format_rust_code)?;
+            if let Err(e) =
+                autoformat_project(check, split_line_attributes, format_rust_code, crate_dir)
+            {
+                eprintln!("error formatting project: {}", e);
+                exit(1);
+            }
         }
 
         Ok(())
@@ -108,9 +130,9 @@ fn refactor_file(
 }
 
 use std::ffi::OsStr;
-fn get_project_files() -> Vec<PathBuf> {
+fn get_project_files(dir: impl AsRef<Path>) -> Vec<PathBuf> {
     let mut files = Vec::new();
-    for result in ignore::Walk::new("./") {
+    for result in ignore::Walk::new(dir) {
         let path = result.unwrap().into_path();
         if let Some(ext) = path.extension() {
             if ext == OsStr::new("rs") {
@@ -161,8 +183,9 @@ fn autoformat_project(
     check: bool,
     split_line_attributes: bool,
     format_rust_code: bool,
+    dir: impl AsRef<Path>,
 ) -> Result<()> {
-    let files_to_format = get_project_files();
+    let files_to_format = get_project_files(dir);
 
     if files_to_format.is_empty() {
         return Ok(());
@@ -285,6 +308,7 @@ async fn test_auto_fmt() {
         raw: Some(test_rsx),
         file: None,
         split_line_attributes: false,
+        package: None,
     };
 
     fmt.autoformat().unwrap();