taitan_orm_parser/template_parser/structs/values/
generic_value.rs

1use crate::template_parser::structs::bool_value::Bool;
2use crate::template_parser::structs::text::Text;
3use crate::template_parser::structs::values::maybe_value::MaybeValue;
4use crate::template_parser::to_sql::SqlSegment;
5use crate::{Number, ToSqlSegment};
6use nom::branch::alt;
7use nom::combinator::map;
8use nom::IResult;
9use std::fmt::Display;
10use crate::template::{BoolValue, NumberValue, TextValue};
11
12#[derive(Debug, Clone, PartialEq)]
13pub enum GenericValue {
14    Bool(Bool),
15    Number(Number),
16    Text(Text),
17    Maybe(MaybeValue),
18}
19
20impl GenericValue {
21    pub fn parse(input: &str) -> IResult<&str, GenericValue> {
22        alt((
23            map(Bool::parse, GenericValue::Bool),
24            map(Number::parse, GenericValue::Number),
25            map(Text::parse, GenericValue::Text),
26            map(MaybeValue::parse, GenericValue::Maybe),
27        ))(input)
28    }
29    pub fn to_number(&self) -> Option<NumberValue> {
30        match self {
31            GenericValue::Number(n) => Some(NumberValue::Value(n.clone())),
32            GenericValue::Maybe(m) => Some(NumberValue::Maybe(m.clone())),
33            _ => None,
34        }
35    }
36    pub fn to_text(&self) -> Option<TextValue> {
37        match self {
38            GenericValue::Text(t) => Some(TextValue::Value(t.clone())),
39            GenericValue::Maybe(m) => Some(TextValue::Maybe(m.clone())),
40            _ => None,
41        }
42    }
43
44    pub fn to_bool(&self) -> Option<BoolValue> {
45        match self {
46            GenericValue::Bool(b) => Some(BoolValue::Value(b.clone())),
47            GenericValue::Maybe(m) => Some(BoolValue::Maybe(m.clone())),
48            _ => None,
49        }
50    }
51}
52
53
54
55
56impl ToSqlSegment for GenericValue {
57    fn gen_sql_segment(&self) -> SqlSegment {
58        match self {
59            GenericValue::Bool(v) => SqlSegment::Simple(v.to_string()),
60            GenericValue::Text(v) => SqlSegment::Simple(v.to_string()),
61            GenericValue::Number(v) => SqlSegment::Simple(v.to_string()),
62            GenericValue::Maybe(maybe_value) => maybe_value.gen_sql_segment(),
63        }
64    }
65}