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_non_null()
15    }
16
17    pub fn pop_outermost_list_wrapping(&mut self) -> Option<ListWrapping> {
18        let end = self.inner.get_list_length();
19        if end == 0 {
20            return None;
21        }
22        // end is exclusive
23        let bit_mask = 1u16 << (end - 1);
24        let list_wrapping = if self.inner.0 & bit_mask != 0 {
25            Some(ListWrapping::ListNonNull)
26        } else {
27            Some(ListWrapping::List)
28        };
29        self.inner.set_list_length(end - 1);
30        list_wrapping
31    }
32
33    pub fn push_outermost_list_wrapping(&mut self, list_wrapping: ListWrapping) {
34        self.inner = match list_wrapping {
35            ListWrapping::ListNonNull => self.inner.list_non_null(),
36            ListWrapping::List => self.inner.list(),
37        };
38    }
39}
40
41impl From<MutableWrapping> for Wrapping {
42    fn from(wrapping: MutableWrapping) -> Self {
43        wrapping.inner
44    }
45}
46
47impl From<Wrapping> for MutableWrapping {
48    fn from(inner: Wrapping) -> Self {
49        Self { inner }
50    }
51}