graphql_wrapping_types/
mutable.rs

1use crate::{ListWrapping, Wrapping};
2
3#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, serde::Serialize, serde::Deserialize)]
4pub struct MutableWrapping {
5    pub(super) inner: Wrapping,
6}
7
8impl MutableWrapping {
9    pub fn is_nullable(&self) -> bool {
10        self.inner.is_nullable()
11    }
12
13    pub fn is_required(&self) -> bool {
14        self.inner.is_required()
15    }
16
17    pub fn write_type_string(&self, name: &str, formatter: &mut dyn std::fmt::Write) -> Result<(), std::fmt::Error> {
18        self.inner.write_type_string(name, formatter)
19    }
20
21    pub fn pop_outermost_list_wrapping(&mut self) -> Option<ListWrapping> {
22        let end = self.inner.get_list_length();
23        if end == 0 {
24            return None;
25        }
26        self.inner.set_list_length(end - 1);
27        // end is exclusive
28        let bit_mask = 1u16 << (end - 1);
29        if self.inner.0 & bit_mask != 0 {
30            Some(ListWrapping::RequiredList)
31        } else {
32            Some(ListWrapping::NullableList)
33        }
34    }
35
36    pub fn push_outermost_list_wrapping(&mut self, list_wrapping: ListWrapping) {
37        self.inner = match list_wrapping {
38            ListWrapping::RequiredList => self.inner.list_non_null(),
39            ListWrapping::NullableList => self.inner.list(),
40        };
41    }
42}
43
44impl From<MutableWrapping> for Wrapping {
45    fn from(wrapping: MutableWrapping) -> Self {
46        wrapping.inner
47    }
48}
49
50impl From<Wrapping> for MutableWrapping {
51    fn from(inner: Wrapping) -> Self {
52        Self { inner }
53    }
54}