1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use crate::{
    error::SerializeError,
    types::{SimpleValue, Value},
};

#[derive(Debug)]
pub struct NamedValue(pub &'static str, pub Value);

impl NamedValue {
    pub fn name(&self) -> &'static str {
        self.0
    }

    pub fn value(&self) -> &Value {
        &self.1
    }

    pub(super) fn into_insert(
        values: &[NamedValue],
        table: &str,
    ) -> Result<String, SerializeError> {
        let mut stmt = String::from("insert into `");
        stmt += table;
        stmt += "` (";
        for (i, value) in values.iter().enumerate() {
            if i != 0 {
                stmt += ", ";
            }
            stmt += "`";
            stmt += value.name();
            stmt += "`";
        }
        stmt += ") values (";
        for i in 0..values.len() {
            if i != 0 {
                stmt += ", ";
            }
            stmt += "?";
        }
        stmt += ")";
        Ok(stmt)
    }

    pub(super) fn into_update(
        values: &[NamedValue],
        table: &str,
        primary: &str,
    ) -> Result<String, SerializeError> {
        let mut stmt = String::from("update `");
        stmt += table;
        stmt += "` set ";
        for (i, value) in values.iter().enumerate() {
            if i != 0 {
                stmt += ", ";
            }
            stmt += "`";
            stmt += value.name();
            stmt += "` = ?";
        }
        stmt += " where `";
        stmt += primary;
        stmt += "` = ?";
        Ok(stmt)
    }
}

impl SimpleValue for NamedValue {
    fn value(&self) -> &Value {
        &self.1
    }
}