Skip to content

Commit afc371b

Browse files
committed
feat: allow support time and chrono
1 parent 0ac11ca commit afc371b

File tree

14 files changed

+381
-217
lines changed

14 files changed

+381
-217
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/sqlx_gen/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "sqlx-gen"
3-
version = "0.4.8"
3+
version = "0.4.9"
44
edition = "2021"
55
description = "Generate Rust structs from database schema introspection"
66
license = "MIT"

crates/sqlx_gen/src/cli.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ pub struct EntitiesArgs {
8787
#[arg(short = 'v', long)]
8888
pub views: bool,
8989

90+
/// Time crate to use for date/time types: chrono (default) or time
91+
#[arg(long, default_value = "chrono")]
92+
pub time_crate: TimeCrate,
93+
9094
/// Print to stdout without writing files
9195
#[arg(short = 'n', long)]
9296
pub dry_run: bool,
@@ -195,6 +199,37 @@ pub enum DatabaseKind {
195199
Sqlite,
196200
}
197201

202+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
203+
pub enum TimeCrate {
204+
#[default]
205+
Chrono,
206+
Time,
207+
}
208+
209+
impl std::str::FromStr for TimeCrate {
210+
type Err = String;
211+
212+
fn from_str(s: &str) -> Result<Self, Self::Err> {
213+
match s {
214+
"chrono" => Ok(Self::Chrono),
215+
"time" => Ok(Self::Time),
216+
other => Err(format!(
217+
"Unknown time crate '{}'. Expected: chrono, time",
218+
other
219+
)),
220+
}
221+
}
222+
}
223+
224+
impl std::fmt::Display for TimeCrate {
225+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
226+
match self {
227+
Self::Chrono => write!(f, "chrono"),
228+
Self::Time => write!(f, "time"),
229+
}
230+
}
231+
}
232+
198233
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
199234
pub enum PoolVisibility {
200235
#[default]
@@ -291,6 +326,7 @@ mod tests {
291326
tables: None,
292327
exclude_tables: None,
293328
views: false,
329+
time_crate: TimeCrate::Chrono,
294330
dry_run: false,
295331
}
296332
}

crates/sqlx_gen/src/codegen/composite_gen.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use heck::{ToSnakeCase, ToUpperCamelCase};
44
use proc_macro2::TokenStream;
55
use quote::{format_ident, quote};
66

7-
use crate::cli::DatabaseKind;
7+
use crate::cli::{DatabaseKind, TimeCrate};
88
use crate::codegen::{imports_for_derives, is_rust_keyword};
99
use crate::introspect::{CompositeTypeInfo, SchemaInfo};
1010
use crate::typemap;
@@ -15,6 +15,7 @@ pub fn generate_composite(
1515
schema_info: &SchemaInfo,
1616
extra_derives: &[String],
1717
type_overrides: &HashMap<String, String>,
18+
time_crate: TimeCrate,
1819
) -> (TokenStream, BTreeSet<String>) {
1920
let mut imports = BTreeSet::new();
2021
for imp in imports_for_derives(extra_derives) {
@@ -51,7 +52,7 @@ pub fn generate_composite(
5152
.fields
5253
.iter()
5354
.map(|col| {
54-
let rust_type = typemap::map_column(col, db_kind, schema_info, type_overrides);
55+
let rust_type = typemap::map_column(col, db_kind, schema_info, type_overrides, time_crate);
5556
if let Some(imp) = &rust_type.needs_import {
5657
imports.insert(imp.clone());
5758
}
@@ -131,7 +132,7 @@ mod tests {
131132

132133
fn gen(composite: &CompositeTypeInfo) -> String {
133134
let schema = SchemaInfo::default();
134-
let (tokens, _) = generate_composite(composite, DatabaseKind::Postgres, &schema, &[], &HashMap::new());
135+
let (tokens, _) = generate_composite(composite, DatabaseKind::Postgres, &schema, &[], &HashMap::new(), TimeCrate::Chrono);
135136
parse_and_format(&tokens)
136137
}
137138

@@ -141,7 +142,7 @@ mod tests {
141142
overrides: &HashMap<String, String>,
142143
) -> (String, BTreeSet<String>) {
143144
let schema = SchemaInfo::default();
144-
let (tokens, imports) = generate_composite(composite, DatabaseKind::Postgres, &schema, derives, overrides);
145+
let (tokens, imports) = generate_composite(composite, DatabaseKind::Postgres, &schema, derives, overrides, TimeCrate::Chrono);
145146
(parse_and_format(&tokens), imports)
146147
}
147148

@@ -187,7 +188,7 @@ mod tests {
187188
fields: vec![make_field("x", "float8", false)],
188189
};
189190
let schema = SchemaInfo::default();
190-
let (tokens, _) = generate_composite(&c, DatabaseKind::Postgres, &schema, &[], &HashMap::new());
191+
let (tokens, _) = generate_composite(&c, DatabaseKind::Postgres, &schema, &[], &HashMap::new(), TimeCrate::Chrono);
191192
let code = parse_and_format(&tokens);
192193
assert!(code.contains("sqlx(type_name = \"point\")"));
193194
}

crates/sqlx_gen/src/codegen/domain_gen.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use heck::ToUpperCamelCase;
44
use proc_macro2::TokenStream;
55
use quote::{format_ident, quote};
66

7-
use crate::cli::DatabaseKind;
7+
use crate::cli::{DatabaseKind, TimeCrate};
88
use crate::introspect::{DomainInfo, SchemaInfo};
99
use crate::typemap;
1010

@@ -13,6 +13,7 @@ pub fn generate_domain(
1313
db_kind: DatabaseKind,
1414
schema_info: &SchemaInfo,
1515
type_overrides: &HashMap<String, String>,
16+
time_crate: TimeCrate,
1617
) -> (TokenStream, BTreeSet<String>) {
1718
let mut imports = BTreeSet::new();
1819
let alias_name = format_ident!("{}", domain.name.to_upper_camel_case());
@@ -34,7 +35,7 @@ pub fn generate_domain(
3435
column_default: None,
3536
};
3637

37-
let rust_type = typemap::map_column(&fake_col, db_kind, schema_info, type_overrides);
38+
let rust_type = typemap::map_column(&fake_col, db_kind, schema_info, type_overrides, time_crate);
3839
if let Some(imp) = &rust_type.needs_import {
3940
imports.insert(imp.clone());
4041
}
@@ -69,13 +70,13 @@ mod tests {
6970

7071
fn gen(domain: &DomainInfo) -> (String, BTreeSet<String>) {
7172
let schema = SchemaInfo::default();
72-
let (tokens, imports) = generate_domain(domain, DatabaseKind::Postgres, &schema, &HashMap::new());
73+
let (tokens, imports) = generate_domain(domain, DatabaseKind::Postgres, &schema, &HashMap::new(), TimeCrate::Chrono);
7374
(parse_and_format(&tokens), imports)
7475
}
7576

7677
fn gen_with_overrides(domain: &DomainInfo, overrides: &HashMap<String, String>) -> (String, BTreeSet<String>) {
7778
let schema = SchemaInfo::default();
78-
let (tokens, imports) = generate_domain(domain, DatabaseKind::Postgres, &schema, overrides);
79+
let (tokens, imports) = generate_domain(domain, DatabaseKind::Postgres, &schema, overrides, TimeCrate::Chrono);
7980
(parse_and_format(&tokens), imports)
8081
}
8182

0 commit comments

Comments
 (0)