Skip to main content

sqlc_gen_sqlx/
config.rs

1use crate::error::Error;
2
3#[derive(Debug, serde::Deserialize)]
4#[serde(default)]
5pub struct Config {
6    pub output: String,
7    pub overrides: Vec<TypeOverride>,
8    pub row_derives: Vec<String>,
9    pub enum_derives: Vec<String>,
10    pub composite_derives: Vec<String>,
11    pub copy_cheap_types: Vec<String>,
12}
13
14impl Default for Config {
15    fn default() -> Self {
16        Self {
17            output: "queries.rs".to_string(),
18            overrides: vec![],
19            row_derives: vec![],
20            enum_derives: vec![],
21            composite_derives: vec![],
22            copy_cheap_types: vec![],
23        }
24    }
25}
26
27impl Config {
28    pub fn from_bytes(bytes: &[u8]) -> Result<Self, Error> {
29        Ok(serde_json::from_slice(bytes)?)
30    }
31}
32
33#[derive(Debug, serde::Deserialize)]
34pub struct TypeOverride {
35    pub db_type: Option<String>,
36    pub column: Option<String>,
37    pub rs_type: String,
38    #[serde(default)]
39    pub copy_cheap: bool,
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn parses_empty_json() {
48        let c = Config::from_bytes(b"{}").unwrap();
49        assert_eq!(c.output, "queries.rs");
50        assert!(c.overrides.is_empty());
51        assert!(c.row_derives.is_empty());
52    }
53
54    #[test]
55    fn parses_output_name() {
56        let c = Config::from_bytes(br#"{"output": "db.rs"}"#).unwrap();
57        assert_eq!(c.output, "db.rs");
58    }
59
60    #[test]
61    fn parses_type_override() {
62        let json = br#"{"overrides":[{"db_type":"timestamptz","rs_type":"chrono::DateTime<chrono::Utc>"}]}"#;
63        let c = Config::from_bytes(json).unwrap();
64        assert_eq!(c.overrides.len(), 1);
65        assert_eq!(c.overrides[0].db_type, Some("timestamptz".to_string()));
66        assert_eq!(c.overrides[0].rs_type, "chrono::DateTime<chrono::Utc>");
67    }
68
69    #[test]
70    fn parses_column_override() {
71        let json = br#"{"overrides":[{"column":"users.created_at","rs_type":"chrono::DateTime<chrono::Local>","copy_cheap":true}]}"#;
72        let c = Config::from_bytes(json).unwrap();
73        assert_eq!(c.overrides[0].column, Some("users.created_at".to_string()));
74        assert!(c.overrides[0].copy_cheap);
75    }
76
77    #[test]
78    fn parses_derives() {
79        let json = br#"{"row_derives":["serde::Serialize"],"enum_derives":["serde::Serialize","serde::Deserialize"]}"#;
80        let c = Config::from_bytes(json).unwrap();
81        assert_eq!(c.row_derives, ["serde::Serialize"]);
82        assert_eq!(c.enum_derives.len(), 2);
83    }
84}