libgraphql_core/
value.rs

1use crate::ast;
2use crate::named_ref::DerefByName;
3use crate::loc;
4use crate::operation::NamedVariableRef;
5use crate::operation::Variable;
6use crate::types::EnumValue;
7use crate::types::NamedEnumValueRef;
8use indexmap::IndexMap;
9
10#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
11pub enum Value {
12    VarRef(NamedVariableRef),
13    #[serde(with = "ast::serde_adapters::SerdeNumber")]
14    Int(ast::Number),
15    Float(f64),
16    String(String),
17    Bool(bool),
18    Null,
19    EnumValue(NamedEnumValueRef),
20    List(Vec<Value>),
21    Object(IndexMap<String, Value>),
22}
23impl Value {
24    pub fn as_str(&self) -> Option<&str> {
25        if let Self::String(str) = self {
26            Some(str.as_str())
27        } else {
28            None
29        }
30    }
31
32    // TODO: Move this to a private function on OperationsBuilder
33    pub(crate) fn from_ast(
34        ast_value: &ast::Value,
35        position: &loc::SourceLocation,
36    ) -> Self {
37        match ast_value {
38            ast::Value::Variable(var_name) =>
39                Value::VarRef(
40                    Variable::named_ref(var_name, position.to_owned()),
41                ),
42
43            ast::Value::Int(value) =>
44                Value::Int(value.clone()),
45
46            ast::Value::Float(value) =>
47                Value::Float(*value),
48
49            ast::Value::String(value) =>
50                Value::String(value.clone()),
51
52            ast::Value::Boolean(value) =>
53                Value::Bool(*value),
54
55            ast::Value::Null =>
56                Value::Null,
57
58            ast::Value::Enum(value) =>
59                Value::EnumValue(
60                    EnumValue::named_ref(value, position.to_owned())
61                ),
62
63            ast::Value::List(values) =>
64                Value::List(values.iter().map(|ast_value|
65                    Value::from_ast(ast_value, position)
66                ).collect()),
67
68            ast::Value::Object(entries) =>
69                Value::Object(entries.iter().map(|(key, ast_value)|
70                    (key.clone(), Value::from_ast(ast_value, position))
71                ).collect()),
72        }
73    }
74}
75