fastn_resolved/
or_type.rs

1#[derive(Debug, Default, Clone, PartialEq, serde::Deserialize, serde::Serialize)]
2pub struct OrType {
3    pub name: String,
4    pub variants: Vec<fastn_resolved::OrTypeVariant>,
5    pub line_number: usize,
6}
7
8impl fastn_resolved::OrType {
9    pub fn new(
10        name: &str,
11        variants: Vec<fastn_resolved::OrTypeVariant>,
12        line_number: usize,
13    ) -> fastn_resolved::OrType {
14        fastn_resolved::OrType {
15            name: name.to_string(),
16            variants,
17            line_number,
18        }
19    }
20
21    pub fn or_type_name(name: &str) -> String {
22        if name.starts_with("ftd") {
23            return name.to_string();
24        }
25        if let Some((_, last)) = name.rsplit_once('#') {
26            return last.to_string();
27        }
28        name.to_string()
29    }
30}
31
32#[derive(Debug, Clone, PartialEq, serde::Deserialize, serde::Serialize)]
33pub enum OrTypeVariant {
34    AnonymousRecord(fastn_resolved::Record),
35    Regular(fastn_resolved::Field),
36    Constant(fastn_resolved::Field),
37}
38
39impl fastn_resolved::OrTypeVariant {
40    pub fn new_record(record: fastn_resolved::Record) -> fastn_resolved::OrTypeVariant {
41        fastn_resolved::OrTypeVariant::AnonymousRecord(record)
42    }
43
44    pub fn new_constant(variant: fastn_resolved::Field) -> fastn_resolved::OrTypeVariant {
45        fastn_resolved::OrTypeVariant::Constant(variant)
46    }
47
48    pub fn new_regular(variant: fastn_resolved::Field) -> fastn_resolved::OrTypeVariant {
49        fastn_resolved::OrTypeVariant::Regular(variant)
50    }
51
52    pub fn is_constant(&self) -> bool {
53        matches!(self, fastn_resolved::OrTypeVariant::Constant(_))
54    }
55
56    pub fn name(&self) -> String {
57        match self {
58            fastn_resolved::OrTypeVariant::AnonymousRecord(ar) => ar.name.to_string(),
59            fastn_resolved::OrTypeVariant::Regular(r) => r.name.to_string(),
60            fastn_resolved::OrTypeVariant::Constant(c) => c.name.to_string(),
61        }
62    }
63
64    pub fn line_number(&self) -> usize {
65        match self {
66            fastn_resolved::OrTypeVariant::AnonymousRecord(ar) => ar.line_number,
67            fastn_resolved::OrTypeVariant::Regular(r) => r.line_number,
68            fastn_resolved::OrTypeVariant::Constant(c) => c.line_number,
69        }
70    }
71
72    pub fn fields(&self) -> Vec<&fastn_resolved::Field> {
73        match self {
74            fastn_resolved::OrTypeVariant::AnonymousRecord(r) => r.fields.iter().collect(),
75            fastn_resolved::OrTypeVariant::Regular(r) => vec![r],
76            fastn_resolved::OrTypeVariant::Constant(c) => vec![c],
77        }
78    }
79}