taitan_orm_parser/template_parser/structs/values/
generic_value.rs1use 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}