fastn_resolved/
or_type.rs1#[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}