cynic_parser/values/
writer.rs1use 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}