tauri_plugin_typegen/interface/
cli.rs

1use 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 TypeScript models and bindings from Tauri commands
28    Generate {
29        /// Path to the Tauri project source directory (default: ./src-tauri)
30        #[arg(short = 'p', long = "project-path", default_value = "./src-tauri")]
31        project_path: PathBuf,
32
33        /// Output path for generated TypeScript files (default: ./src/generated)
34        #[arg(short = 'o', long = "output-path", default_value = "./src/generated")]
35        output_path: PathBuf,
36
37        /// Validation library to use (zod or none)
38        #[arg(short = 'v', long = "validation", default_value = "zod")]
39        validation_library: String,
40
41        /// Verbose output
42        #[arg(long, action = clap::ArgAction::SetTrue)]
43        verbose: bool,
44
45        /// Generate dependency graph visualization
46        #[arg(long, action = clap::ArgAction::SetTrue)]
47        visualize_deps: bool,
48
49        /// Configuration file path
50        #[arg(short = 'c', long = "config")]
51        config_file: Option<PathBuf>,
52    },
53    /// Initialize configuration for a Tauri project
54    Init {
55        /// Output path for configuration file (default: tauri.conf.json)
56        #[arg(short = 'o', long = "output", default_value = "tauri.conf.json")]
57        output_path: PathBuf,
58
59        /// Validation library to use (zod or none)
60        #[arg(short = 'v', long = "validation", default_value = "zod")]
61        validation_library: String,
62
63        /// Force overwrite existing configuration
64        #[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}