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}