Skip to main content

compose_lens/model/
extends.rs

1//! Source-aware raw service `extends` directive.
2
3use crate::source::SourceSpan;
4
5use super::{FieldReference, Located};
6
7/// An authored service `extends` directive without referenced-service resolution.
8#[derive(Debug, Clone, PartialEq, Eq)]
9#[non_exhaustive]
10pub enum Extends {
11    /// A short raw service reference.
12    Short(Located<String>),
13    /// A long reference mapping.
14    Long(ExtendsReference),
15}
16
17/// A long service `extends` reference mapping.
18#[derive(Debug, Clone, PartialEq, Eq)]
19pub struct ExtendsReference {
20    span: SourceSpan,
21    service: Option<Located<String>>,
22    file: Option<Located<String>>,
23    extension_fields: Vec<FieldReference>,
24    unknown_fields: Vec<FieldReference>,
25}
26
27impl ExtendsReference {
28    pub(crate) const fn new(span: SourceSpan) -> Self {
29        Self {
30            span,
31            service: None,
32            file: None,
33            extension_fields: Vec::new(),
34            unknown_fields: Vec::new(),
35        }
36    }
37
38    pub(crate) fn set_service(&mut self, value: Located<String>) {
39        self.service = Some(value);
40    }
41
42    pub(crate) fn set_file(&mut self, value: Located<String>) {
43        self.file = Some(value);
44    }
45
46    pub(crate) fn push_extension(&mut self, field: FieldReference) {
47        self.extension_fields.push(field);
48    }
49
50    pub(crate) fn push_unknown(&mut self, field: FieldReference) {
51        self.unknown_fields.push(field);
52    }
53
54    /// Returns the complete authored long-form mapping span.
55    #[must_use]
56    pub const fn span(&self) -> SourceSpan {
57        self.span
58    }
59
60    /// Returns the raw referenced service without resolution.
61    #[must_use]
62    pub const fn service(&self) -> Option<&Located<String>> {
63        self.service.as_ref()
64    }
65
66    /// Returns the raw referenced file without path access.
67    #[must_use]
68    pub const fn file(&self) -> Option<&Located<String>> {
69        self.file.as_ref()
70    }
71
72    /// Returns retained `x-*` members.
73    #[must_use]
74    pub fn extension_fields(&self) -> &[FieldReference] {
75        &self.extension_fields
76    }
77
78    /// Returns retained unknown or malformed members.
79    #[must_use]
80    pub fn unknown_fields(&self) -> &[FieldReference] {
81        &self.unknown_fields
82    }
83}