From 4d2ecd5858fc33e090c69911009639ac454a2372 Mon Sep 17 00:00:00 2001 From: MrSnowy Date: Sun, 8 Feb 2026 21:10:38 +0100 Subject: [PATCH] Split up commands in seperate files --- src/commands/build_pkg.rs | 20 +++ src/commands/completions.rs | 11 ++ src/commands/mod.rs | 7 + src/commands/option_definition.rs | 32 +++++ src/commands/package_definition.rs | 21 +++ src/commands/project.rs | 117 +++++++++++++++ src/commands/shell.rs | 15 ++ src/commands/test.rs | 28 ++++ src/main.rs | 224 ++--------------------------- 9 files changed, 261 insertions(+), 214 deletions(-) create mode 100644 src/commands/build_pkg.rs create mode 100644 src/commands/completions.rs create mode 100644 src/commands/mod.rs create mode 100644 src/commands/option_definition.rs create mode 100644 src/commands/package_definition.rs create mode 100644 src/commands/project.rs create mode 100644 src/commands/shell.rs create mode 100644 src/commands/test.rs diff --git a/src/commands/build_pkg.rs b/src/commands/build_pkg.rs new file mode 100644 index 0000000..ca5c5fa --- /dev/null +++ b/src/commands/build_pkg.rs @@ -0,0 +1,20 @@ +use std::process::Command; + +pub fn build_pkg(package: String) { + match Command::new("nix") + .args([ + "build", + format!("nixpkgs#{package}").as_str(), + "--print-out-paths", + "--no-link", + ]) + .status() + { + Ok(_) => { + println!("Success") + } + Err(_) => { + println!("Failure") + } + } +} diff --git a/src/commands/completions.rs b/src/commands/completions.rs new file mode 100644 index 0000000..c70d307 --- /dev/null +++ b/src/commands/completions.rs @@ -0,0 +1,11 @@ +use crate::cli::Cli; +use clap::CommandFactory; +use clap_complete::Shell; +use clap_complete::generate; +use std::io; + +pub fn completions(shell: Shell) { + let mut command = Cli::command(); + let command_name = command.get_name().to_string(); + generate(shell, &mut command, command_name, &mut io::stdout()); +} diff --git a/src/commands/mod.rs b/src/commands/mod.rs new file mode 100644 index 0000000..f67a9f3 --- /dev/null +++ b/src/commands/mod.rs @@ -0,0 +1,7 @@ +pub mod build_pkg; +pub mod completions; +pub mod option_definition; +pub mod package_definition; +pub mod project; +pub mod shell; +pub mod test; diff --git a/src/commands/option_definition.rs b/src/commands/option_definition.rs new file mode 100644 index 0000000..9e63e8f --- /dev/null +++ b/src/commands/option_definition.rs @@ -0,0 +1,32 @@ +use std::process::Command; + +use crate::bat; + +pub fn option_definition(option: String) { + match Command::new("nix") + .args([ + "eval", + "--impure", + "--expr", + format!( + "(import {{configuration={{}};}}).options.{option}.declarations" + ) + .as_str(), // format!("[\"test\" \"test\" \"test\" \"test\"]").as_str(), + ]) + .output() + { + Ok(output) => { + let declarations = String::from_utf8(output.stdout) + .unwrap() + .replace("[ ", "") + .replace(" ]", ""); + + declarations + .split(" ") + .for_each(|value| bat(value.replace("\"", ""))); + } + Err(_) => { + println!("Failure") + } + } +} diff --git a/src/commands/package_definition.rs b/src/commands/package_definition.rs new file mode 100644 index 0000000..a4133c7 --- /dev/null +++ b/src/commands/package_definition.rs @@ -0,0 +1,21 @@ +use std::process::Command; + +use crate::bat; + +pub fn package_definition(package: String) { + let command_output = Command::new("nix") + .args(["eval", format!("nixpkgs#{package}.meta.position").as_str()]) + .output() + .unwrap() + .stdout; + + let package_definition = String::from_utf8(command_output) + .unwrap() + .replace("\"", "") + .split(":") + .next() + .map(|value| value.to_string()) + .unwrap(); + + bat(package_definition); +} diff --git a/src/commands/project.rs b/src/commands/project.rs new file mode 100644 index 0000000..507e43d --- /dev/null +++ b/src/commands/project.rs @@ -0,0 +1,117 @@ +use crate::cli; +use crate::cli::ProjectArgs; +use crate::npins; +use indoc::indoc; +use std::env; +use std::fs::File; +use std::fs::create_dir; +use std::io::Write; +use std::path::PathBuf; +use std::process::Command; + +pub fn project(project_args: ProjectArgs) { + match project_args.commands { + cli::ProjectCommands::InitProject { project_name } => { + if project_name != "." { + let project_path = env::current_dir().unwrap().join(project_name); + if !project_path.exists() { + match create_dir(&project_path) { + Ok(_) => {} + Err(err) => { + eprintln!("{}", err); + panic!() + } + } + } + init_proj_files(&project_path); + } else { + let project_path = env::current_dir().unwrap(); + init_proj_files(&project_path); + } + } + }; +} + +fn init_proj_files(project_path: &PathBuf) { + match Command::new("npins") + .args(["init", "--bare"]) + .current_dir(project_path) + .status() + { + Ok(_) => { + println!("Success") + } + Err(_) => { + println!("Failure") + } + } + + npins( + "github", + "nixpkgs", + "nixos-unstable", + "NixOS", + "nixpkgs", + project_path, + ); + + npins( + "github", + "rust-overlay", + "master", + "oxalica", + "rust-overlay", + project_path, + ); + + let mut envrc = File::create_new(project_path.join(".envrc")).unwrap(); + envrc.write_all(b"use_nix").unwrap(); + + let mut shell_nix = File::create_new(project_path.join("shell.nix")).unwrap(); + shell_nix + .write_all( + indoc! {r#" + let + sources = import ./npins; + pkgs = import sources.nixpkgs { + config.allowUnfree = true; + overlays = [ + (import sources.rust-overlay) + ]; + }; + in + pkgs.mkShellNoCC { + nativeBuildInputs = with pkgs; [ + clang + wild + (rust-bin.stable.latest.default.override { + extensions = [ + "rust-src" + "rust-analyzer" + ]; + }) + ]; + shellHook = '' + echo hi + ''; + } + "#} + .as_bytes(), + ) + .unwrap(); + + let cargo_dir = project_path.join(".cargo"); + create_dir(&cargo_dir).unwrap(); + + let mut config_toml = File::create_new(cargo_dir.join("config.toml")).unwrap(); + config_toml + .write_all( + indoc! {r#" + [target.x86_64-unknown-linux-gnu] + linker = "clang" + rustflags = ["-Clink-arg=--ld-path=wild"] + "#} + .as_bytes(), + ) + .unwrap(); +} diff --git a/src/commands/shell.rs b/src/commands/shell.rs new file mode 100644 index 0000000..7f304a8 --- /dev/null +++ b/src/commands/shell.rs @@ -0,0 +1,15 @@ +use std::process::Command; + +pub fn shell(package: String) { + match Command::new("nix") + .args(["shell", format!("nixpkgs#{package}").as_str()]) + .status() + { + Ok(_) => { + println!("Success") + } + Err(_) => { + println!("Failure") + } + } +} diff --git a/src/commands/test.rs b/src/commands/test.rs new file mode 100644 index 0000000..0e5bc78 --- /dev/null +++ b/src/commands/test.rs @@ -0,0 +1,28 @@ +use crate::cli::Hosts; +use clap::ValueEnum; +use std::process::Command; + +pub fn test(host: Hosts) { + let possible_value = host.to_possible_value().unwrap(); + let host = possible_value.get_name(); + + match Command::new("nix") + .args([ + "build", + "--file", + "./default.nix", + format!("hosts.{host}.config.system.build.toplevel").as_str(), + "--print-out-paths", + "--no-link", + "--show-trace", + ]) + .status() + { + Ok(_) => { + println!("Success") + } + Err(_) => { + println!("Failure") + } + }; +} diff --git a/src/main.rs b/src/main.rs index 787882e..1e4fb92 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,233 +1,29 @@ -use std::{ - env::{self}, - fs::{File, create_dir}, - io::{self, Write}, - path::PathBuf, - process::Command, -}; - -use clap::{CommandFactory, Parser, ValueEnum}; -use clap_complete::generate; -use indoc::indoc; +use std::{path::PathBuf, process::Command}; use crate::cli::Cli; +use clap::Parser; mod cli; +mod commands; fn main() { let args = Cli::parse(); match args.commands { - cli::Commands::Test { host } => { - let possible_value = host.to_possible_value().unwrap(); - let host = possible_value.get_name(); - - match Command::new("nix") - .args([ - "build", - "--file", - "./default.nix", - format!("hosts.{host}.config.system.build.toplevel").as_str(), - "--print-out-paths", - "--no-link", - "--show-trace", - ]) - .status() - { - Ok(_) => { - println!("Success") - } - Err(_) => { - println!("Failure") - } - }; - } - cli::Commands::BuildPkg { package } => { - match Command::new("nix") - .args([ - "build", - format!("nixpkgs#{package}").as_str(), - "--print-out-paths", - "--no-link", - ]) - .status() - { - Ok(_) => { - println!("Success") - } - Err(_) => { - println!("Failure") - } - } - } - cli::Commands::Shell { package } => { - match Command::new("nix") - .args(["shell", format!("nixpkgs#{package}").as_str()]) - .status() - { - Ok(_) => { - println!("Success") - } - Err(_) => { - println!("Failure") - } - } - } - cli::Commands::Project(project_args) => match project_args.commands { - cli::ProjectCommands::InitProject { project_name } => { - if project_name != "." { - let project_path = env::current_dir().unwrap().join(project_name); - if !project_path.exists() { - match create_dir(&project_path) { - Ok(_) => {} - Err(err) => { - eprintln!("{}", err); - panic!() - } - } - } - init_proj_files(&project_path); - } else { - let project_path = env::current_dir().unwrap(); - init_proj_files(&project_path); - } - } - }, + cli::Commands::Test { host } => commands::test::test(host), + cli::Commands::BuildPkg { package } => commands::build_pkg::build_pkg(package), + cli::Commands::Shell { package } => commands::shell::shell(package), + cli::Commands::Project(project_args) => commands::project::project(project_args), cli::Commands::PackageDefinition { package } => { - let command_output = Command::new("nix") - .args(["eval", format!("nixpkgs#{package}.meta.position").as_str()]) - .output() - .unwrap() - .stdout; - - let package_definition = String::from_utf8(command_output) - .unwrap() - .replace("\"", "") - .split(":") - .next() - .map(|value| value.to_string()) - .unwrap(); - - bat(package_definition); + commands::package_definition::package_definition(package) } cli::Commands::OptionDefinition { option } => { - match Command::new("nix") - .args([ - "eval", - "--impure", - "--expr", - format!("(import {{configuration={{}};}}).options.{option}.declarations").as_str() - // format!("[\"test\" \"test\" \"test\" \"test\"]").as_str(), - ]) - .output() - { - Ok(output) => { - let declarations = String::from_utf8(output.stdout) - .unwrap() - .replace("[ ", "") - .replace(" ]", ""); - - declarations - .split(" ") - .for_each(|value| bat(value.replace("\"", ""))); - } - Err(_) => { - println!("Failure") - } - } - } - cli::Commands::Completions { shell } => { - let mut command = Cli::command(); - let command_name = command.get_name().to_string(); - generate(shell, &mut command, command_name, &mut io::stdout()); + commands::option_definition::option_definition(option) } + cli::Commands::Completions { shell } => commands::completions::completions(shell), } } -fn init_proj_files(project_path: &PathBuf) { - match Command::new("npins") - .args(["init", "--bare"]) - .current_dir(project_path) - .status() - { - Ok(_) => { - println!("Success") - } - Err(_) => { - println!("Failure") - } - } - - npins( - "github", - "nixpkgs", - "nixos-unstable", - "NixOS", - "nixpkgs", - project_path, - ); - - npins( - "github", - "rust-overlay", - "master", - "oxalica", - "rust-overlay", - project_path, - ); - - let mut envrc = File::create_new(project_path.join(".envrc")).unwrap(); - envrc.write_all(b"use_nix").unwrap(); - - let mut shell_nix = File::create_new(project_path.join("shell.nix")).unwrap(); - shell_nix - .write_all( - indoc! {r#" - let - sources = import ./npins; - pkgs = import sources.nixpkgs { - config.allowUnfree = true; - overlays = [ - (import sources.rust-overlay) - ]; - }; - in - pkgs.mkShellNoCC { - nativeBuildInputs = with pkgs; [ - clang - wild - (rust-bin.stable.latest.default.override { - extensions = [ - "rust-src" - "rust-analyzer" - ]; - }) - ]; - shellHook = '' - echo hi - ''; - } - "#} - .as_bytes(), - ) - .unwrap(); - - let cargo_dir = project_path.join(".cargo"); - create_dir(&cargo_dir).unwrap(); - - let mut config_toml = File::create_new(cargo_dir.join("config.toml")).unwrap(); - config_toml - .write_all( - indoc! {r#" - [target.x86_64-unknown-linux-gnu] - linker = "clang" - rustflags = ["-Clink-arg=--ld-path=wild"] - "#} - .as_bytes(), - ) - .unwrap(); -} - fn npins( source_type: &str, display_name: &str, -- 2.51.2