cog_task/resource/
text.rs

1use crate::gui::text::body;
2use eframe::egui::Ui;
3use egui_demo_lib::easy_mark::easy_mark;
4use eyre::{eyre, Result};
5use regex::Regex;
6use serde::{Deserialize, Serialize};
7use std::path::PathBuf;
8
9pub fn parse_text(ui: &mut Ui, text: &str) -> Result<()> {
10    let re = Regex::new(r"^!!<([[:alpha:]][[:word:]]*)>[ \t]*\n?([ \t]*\n)?").unwrap();
11    if let Some(caps) = re.captures(text) {
12        match &caps[1] {
13            "easy_mark" => {
14                easy_mark(ui, &re.replace(text, ""));
15                Ok(())
16            }
17            parser => Err(eyre!("Unknown text parser ({parser}).")),
18        }
19    } else {
20        ui.label(body(text));
21        Ok(())
22    }
23}
24
25#[derive(Debug, Clone, Deserialize, Serialize)]
26#[serde(untagged)]
27pub enum OptionalString {
28    Some(String),
29    None,
30}
31
32#[derive(Debug, Clone, Deserialize, Serialize)]
33#[serde(untagged)]
34pub enum OptionalPath {
35    Some(PathBuf),
36    None,
37}
38
39impl Default for OptionalString {
40    fn default() -> Self {
41        Self::None
42    }
43}
44
45impl OptionalString {
46    pub fn is_some(&self) -> bool {
47        matches!(self, Self::Some(_))
48    }
49
50    pub fn is_none(&self) -> bool {
51        matches!(self, Self::None)
52    }
53}
54
55impl Default for OptionalPath {
56    fn default() -> Self {
57        Self::None
58    }
59}
60
61impl OptionalPath {
62    pub fn is_some(&self) -> bool {
63        matches!(self, Self::Some(_))
64    }
65
66    pub fn is_none(&self) -> bool {
67        matches!(self, Self::None)
68    }
69}