cog_task/resource/
text.rs1use 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}