capability_example/
clipboard_snippet.rs

1// ---------------- [ File: capability-example/src/clipboard_snippet.rs ]
2crate::ix!();
3
4/// Helper function for “precise parse” of StrippedStringSkeleton
5pub fn precise_parse_clipboard_stripped_skeleton() -> Result<StrippedStringSkeleton, std::io::Error> {
6    let mut ctx = ClipboardContext::new().map_err(|e| {
7        std::io::Error::new(std::io::ErrorKind::Other, format!("Clipboard context error: {e}"))
8    })?;
9    let contents = ctx.get_contents().map_err(|e| {
10        std::io::Error::new(std::io::ErrorKind::Other, format!("Clipboard get_contents error: {e}"))
11    })?;
12    let json_val: serde_json::Value = serde_json::from_str(&contents).map_err(|e| {
13        std::io::Error::new(std::io::ErrorKind::InvalidData, format!("Clipboard JSON parse error: {e}"))
14    })?;
15    let parsed = try_deserialize_with_path::<StrippedStringSkeleton>(&json_val).map_err(|e| {
16        std::io::Error::new(std::io::ErrorKind::InvalidData, format!("StrippedStringSkeleton parse error: {e}"))
17    })?;
18    Ok(parsed)
19}
20
21/// Simple enum to hold whichever snippet we parsed successfully.
22#[derive(Debug)]
23pub enum ClipboardSnippet {
24    JustifiedGrowerTreeConfiguration(JustifiedGrowerTreeConfiguration),
25    JustifiedStringSkeleton(JustifiedStringSkeleton),
26    StrippedStringSkeleton(StrippedStringSkeleton),
27    CoreStringSkeleton(CoreStringSkeleton),
28    AnnotatedLeafHolderExpansions(AnnotatedLeafHolderExpansions),
29}
30
31impl ClipboardSnippet {
32
33    /// Return the target_name from whichever snippet we hold
34    pub fn target_name(&self) -> Option<&String> {
35        match self {
36            ClipboardSnippet::JustifiedGrowerTreeConfiguration(cfg) => Some(cfg.target_name()),
37            ClipboardSnippet::JustifiedStringSkeleton(sk)           => Some(sk.target_name()),
38            ClipboardSnippet::StrippedStringSkeleton(sk)            => Some(sk.target_name()),
39            ClipboardSnippet::CoreStringSkeleton(sk)                => Some(sk.target_name()),
40            ClipboardSnippet::AnnotatedLeafHolderExpansions(ann)    => Some(ann.target_name()),
41        }
42    }
43
44    /// Decide if this snippet’s type matches the given missing partial step 
45    pub fn matches_missing_field(
46        &self,
47        missing: Option<GrowerModelGenerationInvalidPartial>
48    ) -> bool {
49        use GrowerModelGenerationInvalidPartial::*;
50        match (missing, self) {
51            (Some(MissingJustifiedGrowerTreeConfiguration), ClipboardSnippet::JustifiedGrowerTreeConfiguration(_)) => true,
52            (Some(MissingJustifiedStringSkeleton),          ClipboardSnippet::JustifiedStringSkeleton(_))          => true,
53            (Some(MissingStrippedStringSkeleton),           ClipboardSnippet::StrippedStringSkeleton(_))           => true,
54            (Some(MissingCoreStringSkeleton),               ClipboardSnippet::CoreStringSkeleton(_))               => true,
55            (Some(MissingAnnotatedLeafHolderExpansions),    ClipboardSnippet::AnnotatedLeafHolderExpansions(_))    => true,
56            _ => false,
57        }
58    }
59}
60
61pub trait ApplyClipboardSnippet {
62
63    fn apply_clipboard_snippet(&mut self, snippet: ClipboardSnippet);
64}
65
66impl ApplyClipboardSnippet for PartiallyGrownModel {
67
68    /// Apply the snippet to this partial by setting whichever field is missing
69    fn apply_clipboard_snippet(&mut self, snippet: ClipboardSnippet) {
70        match snippet {
71            ClipboardSnippet::JustifiedGrowerTreeConfiguration(cfg) => {
72                self.set_maybe_ungrown_justified_grower_tree_configuration(Some(cfg));
73            }
74            ClipboardSnippet::JustifiedStringSkeleton(sk) => {
75                self.set_maybe_ungrown_justified_string_skeleton(Some(sk));
76            }
77            ClipboardSnippet::StrippedStringSkeleton(sk) => {
78                self.set_maybe_ungrown_stripped_string_skeleton(Some(sk));
79            }
80            ClipboardSnippet::CoreStringSkeleton(sk) => {
81                self.set_maybe_ungrown_core_string_skeleton(Some(sk));
82            }
83            ClipboardSnippet::AnnotatedLeafHolderExpansions(ann) => {
84                self.set_maybe_ungrown_annotated_leaf_holder_expansions(Some(ann));
85            }
86        }
87    }
88}
89
90/// Return an integer rank for a missing partial step:
91///   0 => partial is not missing anything (fully valid)
92///   1 => MissingJustifiedGrowerTreeConfiguration
93///   2 => MissingJustifiedStringSkeleton
94///   3 => MissingStrippedStringSkeleton
95///   4 => MissingCoreStringSkeleton
96///   5 => MissingAnnotatedLeafHolderExpansions
97pub fn missing_field_rank(missing: &Option<GrowerModelGenerationInvalidPartial>) -> i32 {
98    use GrowerModelGenerationInvalidPartial::*;
99    match missing {
100        None => 0,
101        Some(MissingJustifiedGrowerTreeConfiguration) => 1,
102        Some(MissingJustifiedStringSkeleton)          => 2,
103        Some(MissingStrippedStringSkeleton)           => 3,
104        Some(MissingCoreStringSkeleton)               => 4,
105        Some(MissingAnnotatedLeafHolderExpansions)    => 5,
106    }
107}
108
109/// Return a similar rank for each ClipboardSnippet variant:
110pub fn snippet_field_rank(snippet: &ClipboardSnippet) -> i32 {
111    match snippet {
112        ClipboardSnippet::JustifiedGrowerTreeConfiguration(_) => 1,
113        ClipboardSnippet::JustifiedStringSkeleton(_)          => 2,
114        ClipboardSnippet::StrippedStringSkeleton(_)           => 3,
115        ClipboardSnippet::CoreStringSkeleton(_)               => 4,
116        ClipboardSnippet::AnnotatedLeafHolderExpansions(_)    => 5,
117    }
118}