tauri_plugin_typegen/interface/
cli.rs1use crate::interface::config::GenerateConfig;
2use clap::{Args, Parser, Subcommand};
3use std::path::PathBuf;
4
5#[derive(Parser)]
6#[command(name = "cargo")]
7#[command(bin_name = "cargo")]
8pub struct CargoCli {
9 #[command(subcommand)]
10 pub command: CargoSubcommands,
11}
12
13#[derive(Subcommand)]
14pub enum CargoSubcommands {
15 #[command(name = "tauri-typegen")]
16 TauriTypegen(TauriTypegenArgs),
17}
18
19#[derive(Args)]
20pub struct TauriTypegenArgs {
21 #[command(subcommand)]
22 pub command: TypegenCommands,
23}
24
25#[derive(Subcommand)]
26pub enum TypegenCommands {
27 Generate {
29 #[arg(short = 'p', long = "project-path", default_value = "./src-tauri")]
31 project_path: PathBuf,
32
33 #[arg(short = 'o', long = "output-path", default_value = "./src/generated")]
35 output_path: PathBuf,
36
37 #[arg(short = 'v', long = "validation", default_value = "zod")]
39 validation_library: String,
40
41 #[arg(long, action = clap::ArgAction::SetTrue)]
43 verbose: bool,
44
45 #[arg(long, action = clap::ArgAction::SetTrue)]
47 visualize_deps: bool,
48
49 #[arg(short = 'c', long = "config")]
51 config_file: Option<PathBuf>,
52 },
53 Init {
55 #[arg(short = 'o', long = "output", default_value = "tauri.conf.json")]
57 output_path: PathBuf,
58
59 #[arg(short = 'v', long = "validation", default_value = "zod")]
61 validation_library: String,
62
63 #[arg(long, action = clap::ArgAction::SetTrue)]
65 force: bool,
66 },
67}
68
69impl From<&TypegenCommands> for GenerateConfig {
70 fn from(cmd: &TypegenCommands) -> Self {
71 match cmd {
72 TypegenCommands::Generate {
73 project_path,
74 output_path,
75 validation_library,
76 verbose,
77 visualize_deps,
78 ..
79 } => GenerateConfig {
80 project_path: project_path.to_string_lossy().to_string(),
81 output_path: output_path.to_string_lossy().to_string(),
82 validation_library: validation_library.clone(),
83 verbose: Some(*verbose),
84 visualize_deps: Some(*visualize_deps),
85 ..Default::default()
86 },
87 TypegenCommands::Init {
88 validation_library, ..
89 } => GenerateConfig {
90 validation_library: validation_library.clone(),
91 ..Default::default()
92 },
93 }
94 }
95}
96
97#[cfg(test)]
98mod tests {
99 use super::*;
100
101 #[test]
102 fn test_default_generate_config_from_cli() {
103 let cmd = TypegenCommands::Generate {
104 project_path: PathBuf::from("./src-tauri"),
105 output_path: PathBuf::from("./src/generated"),
106 validation_library: "zod".to_string(),
107 verbose: false,
108 visualize_deps: false,
109 config_file: None,
110 };
111
112 let config = GenerateConfig::from(&cmd);
113 assert_eq!(config.project_path, "./src-tauri");
114 assert_eq!(config.output_path, "./src/generated");
115 assert_eq!(config.validation_library, "zod");
116 assert!(!config.verbose.unwrap_or(false));
117 }
118
119 #[test]
120 fn test_custom_generate_config_from_cli() {
121 let cmd = TypegenCommands::Generate {
122 project_path: PathBuf::from("./my-tauri"),
123 output_path: PathBuf::from("./types"),
124 validation_library: "none".to_string(),
125 verbose: true,
126 visualize_deps: true,
127 config_file: None,
128 };
129
130 let config = GenerateConfig::from(&cmd);
131 assert_eq!(config.project_path, "./my-tauri");
132 assert_eq!(config.output_path, "./types");
133 assert_eq!(config.validation_library, "none");
134 assert!(config.verbose.unwrap_or(false));
135 assert!(config.visualize_deps.unwrap_or(false));
136 }
137}