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 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