Skip to main content

meta_language/
substitution.rs

1use crate::link_network::LinkId;
2
3/// Match-and-substitute rule over exact link references.
4#[derive(Clone, Debug, PartialEq, Eq)]
5pub struct SubstitutionRule {
6    pattern: Vec<LinkId>,
7    replacement: Vec<LinkId>,
8}
9
10impl SubstitutionRule {
11    /// Creates a rule that replaces links with `pattern` references by
12    /// `replacement` references.
13    #[must_use]
14    pub fn new<const P: usize, const R: usize>(
15        pattern: [LinkId; P],
16        replacement: [LinkId; R],
17    ) -> Self {
18        Self {
19            pattern: pattern.to_vec(),
20            replacement: replacement.to_vec(),
21        }
22    }
23
24    /// Creates a rule that inserts a new relation link.
25    #[must_use]
26    pub fn create<const R: usize>(replacement: [LinkId; R]) -> Self {
27        Self {
28            pattern: Vec::new(),
29            replacement: replacement.to_vec(),
30        }
31    }
32
33    /// Creates a rule that deletes links matching `pattern`.
34    #[must_use]
35    pub fn delete<const P: usize>(pattern: [LinkId; P]) -> Self {
36        Self {
37            pattern: pattern.to_vec(),
38            replacement: Vec::new(),
39        }
40    }
41
42    pub(crate) fn pattern(&self) -> &[LinkId] {
43        &self.pattern
44    }
45
46    pub(crate) fn replacement(&self) -> &[LinkId] {
47        &self.replacement
48    }
49}
50
51/// Result of applying a substitution rule.
52#[derive(Clone, Debug, Default, PartialEq, Eq)]
53pub struct SubstitutionReport {
54    pub(crate) created: Vec<LinkId>,
55    pub(crate) updated: Vec<LinkId>,
56    pub(crate) deleted: Vec<LinkId>,
57}
58
59impl SubstitutionReport {
60    /// Created link ids.
61    #[must_use]
62    pub fn created(&self) -> &[LinkId] {
63        &self.created
64    }
65
66    /// Updated link ids.
67    #[must_use]
68    pub fn updated(&self) -> &[LinkId] {
69        &self.updated
70    }
71
72    /// Deleted link ids.
73    #[must_use]
74    pub fn deleted(&self) -> &[LinkId] {
75        &self.deleted
76    }
77}