cynic_parser/values/
writer.rs

1use std::sync::Arc;
2
3use indexmap::IndexSet;
4
5use crate::{common::IdRange, Span};
6
7pub use super::{ids::*, storage::*};
8
9#[derive(Default)]
10pub struct ValueWriter {
11    values: Vec<ValueRecord>,
12
13    fields: Vec<FieldRecord>,
14}
15
16impl ValueWriter {
17    pub fn update(store: super::ValueStore) -> Self {
18        let super::ValueStore {
19            strings: _,
20            values,
21            fields,
22        } = store;
23
24        Self { values, fields }
25    }
26
27    pub fn value(&mut self, record: ValueRecord) -> ValueId {
28        let id = ValueId::new(self.values.len());
29        self.values.push(record);
30        id
31    }
32
33    pub fn const_value(&mut self, record: ValueRecord) -> ConstValueId {
34        if let ValueKind::Variable(_) = record.kind {
35            panic!("Don't pass a variable into const_value");
36        }
37        let value_id = self.value(record);
38        ConstValueId::new(value_id.get())
39    }
40
41    pub fn list(&mut self, values: Vec<ValueRecord>) -> IdRange<ValueId> {
42        let start = ValueId::new(self.values.len());
43
44        self.values.extend(values);
45
46        let end = ValueId::new(self.values.len());
47
48        IdRange::new(start, end)
49    }
50
51    pub fn fields(&mut self, records: Vec<(StringId, Span, ValueId)>) -> IdRange<FieldId> {
52        let start = FieldId::new(self.fields.len());
53
54        self.fields.extend(
55            records
56                .into_iter()
57                .map(|(name, name_span, value)| FieldRecord {
58                    name,
59                    name_span,
60                    value,
61                }),
62        );
63
64        let end = FieldId::new(self.fields.len());
65
66        IdRange::new(start, end)
67    }
68
69    pub fn const_fields(
70        &mut self,
71        records: Vec<(StringId, Span, ConstValueId)>,
72    ) -> IdRange<FieldId> {
73        let start = FieldId::new(self.fields.len());
74
75        self.fields.extend(
76            records
77                .into_iter()
78                .map(|(name, name_span, value)| FieldRecord {
79                    name,
80                    name_span,
81                    value: ValueId::new(value.get()),
82                }),
83        );
84
85        let end = FieldId::new(self.fields.len());
86
87        IdRange::new(start, end)
88    }
89
90    pub(crate) fn finish(self, strings: Arc<IndexSet<Box<str>>>) -> super::ValueStore {
91        let ValueWriter { values, fields } = self;
92
93        super::ValueStore {
94            strings,
95            values,
96            fields,
97        }
98    }
99}