diff --git a/src/common/cli.rs b/src/common/cli.rs index cc1f1ad7..6f267f50 100644 --- a/src/common/cli.rs +++ b/src/common/cli.rs @@ -1,12 +1,13 @@ -use crate::common::types::{DatabaseType, JsExtension, LogLevel}; +use crate::common::types::{DatabaseType, FileExtension, LogLevel}; use clap::Parser; use std::fmt; -impl fmt::Display for JsExtension { +impl fmt::Display for FileExtension { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let extension = match self { - JsExtension::Ts => ".ts".to_string(), - JsExtension::Js => ".js".to_string(), + FileExtension::Ts => ".ts".to_string(), + FileExtension::Js => ".js".to_string(), + FileExtension::Sql => ".sql".to_string(), }; write!(f, "{}", extension) } @@ -19,13 +20,13 @@ pub struct Cli { #[clap(parse(from_os_str))] pub path: std::path::PathBuf, - /// Javascript Extension + /// file extensions #[clap( value_enum, long, - default_value_t=JsExtension::Ts + multiple_values = true )] - pub ext: JsExtension, + pub ext: Vec, /// Type of primary database to connect #[clap(value_enum, long)] diff --git a/src/common/types.rs b/src/common/types.rs index 1ce38d1a..3ca56c94 100644 --- a/src/common/types.rs +++ b/src/common/types.rs @@ -1,11 +1,12 @@ -use clap::ValueEnum; +use clap::{ValueEnum, ArgEnum}; use convert_case::{Case, Casing}; use serde::{Deserialize, Serialize}; -#[derive(ValueEnum, Debug, Clone)] -pub enum JsExtension { +#[derive(ArgEnum, Debug, Clone)] +pub enum FileExtension { Ts, Js, + Sql, } #[derive(ValueEnum, Debug, Clone, Serialize, Deserialize)] diff --git a/src/main.rs b/src/main.rs index 59299145..927f27c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,7 +32,9 @@ use crate::ts_generator::generator::clear_single_ts_file_if_exists; use crate::{parser::parse_source, scan_folder::scan_folder}; use color_eyre::eyre::Result; use std::env; +use std::path::PathBuf; use std::sync::LazyLock; +use crate::common::types::FileExtension; fn set_default_env_var() { if env::var("SQLX_TS_LOG").is_err() { @@ -63,19 +65,26 @@ async fn main() -> Result<()> { set_default_env_var(); let source_folder = &CLI_ARGS.path; - let ext = &CLI_ARGS.ext; + // If no file extensions were provided + let exts = if CLI_ARGS.ext.is_empty() { + vec![FileExtension::Ts] + } else { + CLI_ARGS.ext.clone() + }; - info!("Scanning {:?} for SQLs with extension {}", source_folder, ext); + let exts_str = exts.iter().map(|ext| ext.to_string()).collect::>().join(","); + + info!("Scanning {:?} for SQLs with extensions [{}]", source_folder, exts_str); // If CLI_ARGS.generate_types is true, it will clear the single TS file so `execute` will generate a new one from scratch clear_single_ts_file_if_exists()?; - let files = scan_folder(source_folder, ext); + let files: Vec = exts.iter().map(|ext| scan_folder(source_folder, ext)).into_iter().flatten().collect(); if files.is_empty() { info!( - "No targets detected, is it an empty folder? - source_folder: {:?}, ext: {}", - source_folder, ext + "No targets detected, is it an empty folder? - source_folder: {:?}, file extensions: [{}]", + source_folder, exts_str, ); std::process::exit(0); } diff --git a/src/scan_folder.rs b/src/scan_folder.rs index 5a17dd5f..4be16b63 100644 --- a/src/scan_folder.rs +++ b/src/scan_folder.rs @@ -1,7 +1,7 @@ use std::path::{Path, PathBuf}; use crate::common::lazy::CONFIG; -use crate::common::types::JsExtension; +use crate::common::types::FileExtension; use regex::{Error as RegexError, Regex}; use walkdir::WalkDir; @@ -32,7 +32,7 @@ fn is_match(pattern: &str, path: &Path) -> bool { } } -pub fn scan_folder<'a>(folder: &'a PathBuf, js_extension: &'a JsExtension) -> Vec { +pub fn scan_folder<'a>(folder: &'a PathBuf, file_extension: &'a FileExtension) -> Vec { let ignore_paths = &CONFIG.ignore_patterns; let node_modules_path = folder.join(Path::new("node_modules")); let path = Path::new(folder); @@ -56,7 +56,7 @@ pub fn scan_folder<'a>(folder: &'a PathBuf, js_extension: &'a JsExtension) -> Ve let f_name = entry.file_name().to_string_lossy(); - f_name.ends_with(js_extension.to_string().as_str()) + f_name.ends_with(file_extension.to_string().as_str()) }) .map(|entry| entry.path().to_owned()) .collect(); diff --git a/tests/sample/sample.queries.ts b/tests/sample/sample.queries.ts index 6670dfd7..1d19c61a 100644 --- a/tests/sample/sample.queries.ts +++ b/tests/sample/sample.queries.ts @@ -2,7 +2,7 @@ export type SampleSelectQueryParams = [number]; export interface ISampleSelectQueryResult { name: string; - some_id: number; + someId: number; }; export interface ISampleSelectQueryQuery { diff --git a/tests/sample/some-query.sql b/tests/sample/some-query.sql new file mode 100644 index 00000000..5f156143 --- /dev/null +++ b/tests/sample/some-query.sql @@ -0,0 +1 @@ +INSERT INTO items (name) VALUES ($1)