sqlink 0.6.0

postgres builder to work with postgres
Documentation
use crate::error::Error;

#[derive(Clone, Debug)]
pub struct QuerySelects(Vec<QuerySelectField>);

impl Default for QuerySelects {
    fn default() -> Self {
        QuerySelects(Vec::new())
    }
}

impl QuerySelects {
    pub fn build(&self) -> Result<String, Error> {
        Ok(self.0.clone().into_iter().map(|s| s.build()).collect::<Vec<String>>().join(", "))
    }
    pub fn push(&mut self, field: QuerySelectField) {
        self.0.push(field);
    }
    pub fn len(&self) -> usize {
        self.0.len()
    }
}

#[derive(Clone, Debug)]
pub struct QuerySelectField {
    pub name: String,
    pub alias: Option<String>,
}

impl QuerySelectField {
    fn build(&self) -> String {
        if let Some(alias) = &self.alias {
            format!("{} AS {}", self.name, alias)
        } else {
            self.name.clone()
        }
    }
}

impl From<&str> for QuerySelectField {
    fn from(field: &str) -> Self {
        QuerySelectField {
            name: field.to_owned(),
            alias: None,
        }
    }
}

impl From<(&str, &str)> for QuerySelectField {
    fn from(fieldandalias: (&str, &str)) -> Self {
        QuerySelectField {
            name: fieldandalias.0.to_owned(),
            alias: Some(fieldandalias.1.to_owned()),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_select_field_1() {
        let field: QuerySelectField = QuerySelectField {
            alias: Some("uid".to_owned()),
            name: "u.id".to_owned(),
        };

        assert_eq!(field.build(), "u.id AS uid");
    }

    #[test]
    fn test_select_field_2() {
        let field: QuerySelectField = "user_id".into();
        assert_eq!(field.build(), "user_id");
    }

    #[test]
    fn test_select_field_3() {
        let field: QuerySelectField = ("user_id", "uid").into();
        assert_eq!(field.build(), "user_id AS uid");
    }
}