docling_core/
revisions.rs1use std::fmt;
6use std::str::FromStr;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
18pub enum TrackChanges {
19 #[default]
20 Accept,
21 Reject,
22 All,
23}
24
25impl TrackChanges {
26 pub const ACCEPTED: &'static str = "accept, reject, all";
28
29 pub fn parse(s: &str) -> Option<Self> {
31 match s.trim().to_ascii_lowercase().as_str() {
32 "accept" | "accepted" => Some(Self::Accept),
33 "reject" | "rejected" => Some(Self::Reject),
34 "all" => Some(Self::All),
35 _ => None,
36 }
37 }
38
39 pub fn as_str(self) -> &'static str {
40 match self {
41 Self::Accept => "accept",
42 Self::Reject => "reject",
43 Self::All => "all",
44 }
45 }
46}
47
48impl fmt::Display for TrackChanges {
49 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50 f.write_str(self.as_str())
51 }
52}
53
54impl FromStr for TrackChanges {
55 type Err = String;
56
57 fn from_str(s: &str) -> Result<Self, String> {
58 Self::parse(s)
59 .ok_or_else(|| format!("track_changes must be one of {}; got {s:?}", Self::ACCEPTED))
60 }
61}
62
63#[derive(Debug, Clone, Copy, PartialEq, Eq)]
65pub enum RevisionKind {
66 Insertion,
68 Deletion,
70}
71
72impl RevisionKind {
73 pub fn as_str(self) -> &'static str {
75 match self {
76 Self::Insertion => "insertion",
77 Self::Deletion => "deletion",
78 }
79 }
80}
81
82#[derive(Debug, Clone, PartialEq, Eq)]
86pub struct Revision {
87 pub kind: RevisionKind,
88 pub author: Option<String>,
90 pub date: Option<String>,
92}
93
94#[cfg(test)]
95mod tests {
96 use super::*;
97
98 #[test]
99 fn spellings() {
100 assert_eq!("Accept".parse::<TrackChanges>(), Ok(TrackChanges::Accept));
101 assert_eq!(" all ".parse::<TrackChanges>(), Ok(TrackChanges::All));
102 assert_eq!(TrackChanges::parse("rejected"), Some(TrackChanges::Reject));
103 assert!("keep".parse::<TrackChanges>().is_err());
104 assert_eq!(TrackChanges::default().as_str(), "accept");
105 }
106}