jsonld_syntax/
compact_iri.rs1use iri_rs::{IriRef, IriRefBuf};
2
3pub struct InvalidCompactIri<T>(pub T);
5
6#[derive(PartialEq, Eq, Hash, PartialOrd, Ord, Debug)]
7#[repr(transparent)]
11pub struct CompactIri(str);
12
13impl CompactIri {
14 pub fn new(s: &str) -> Result<&Self, InvalidCompactIri<&str>> {
20 match s.split_once(':') {
21 Some((prefix, suffix)) if prefix != "_" && !suffix.starts_with("//") => match IriRef::parse(s) {
22 Ok(_) => Ok(unsafe { Self::new_unchecked(s) }),
23 Err(_) => Err(InvalidCompactIri(s)),
24 },
25 _ => Err(InvalidCompactIri(s)),
26 }
27 }
28
29 #[must_use]
37 pub unsafe fn new_unchecked(s: &str) -> &Self {
38 unsafe { &*(std::ptr::from_ref::<str>(s) as *const Self) }
41 }
42
43 #[must_use]
45 pub fn as_str(&self) -> &str {
46 &self.0
47 }
48
49 #[must_use]
51 pub fn to_owned(&self) -> CompactIriBuf {
52 CompactIriBuf(self.0.to_owned())
53 }
54
55 #[must_use]
57 pub fn prefix(&self) -> &str {
58 let i = unsafe { self.find(':').unwrap_unchecked() };
61 &self[0..i]
62 }
63
64 #[must_use]
66 pub fn suffix(&self) -> &str {
67 let i = unsafe { self.find(':').unwrap_unchecked() };
69 &self[i + 1..]
70 }
71
72 #[must_use]
77 pub fn as_iri_ref(&self) -> IriRef<&str> {
78 unsafe { IriRef::parse(self.as_str()).unwrap_unchecked() }
80 }
81}
82
83impl std::ops::Deref for CompactIri {
84 type Target = str;
85
86 fn deref(&self) -> &str {
87 &self.0
88 }
89}
90
91impl std::borrow::Borrow<str> for CompactIri {
92 fn borrow(&self) -> &str {
93 &self.0
94 }
95}
96
97impl AsRef<str> for CompactIri {
98 fn as_ref(&self) -> &str {
99 &self.0
100 }
101}
102
103#[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Debug)]
104pub struct CompactIriBuf(String);
106
107impl CompactIriBuf {
108 pub fn new(s: String) -> Result<Self, InvalidCompactIri<String>> {
114 match CompactIri::new(&s) {
115 Ok(_) => Ok(unsafe { Self::new_unchecked(s) }),
116 Err(_) => Err(InvalidCompactIri(s)),
117 }
118 }
119
120 #[must_use]
126 pub unsafe fn new_unchecked(s: String) -> Self {
127 Self(s)
128 }
129
130 #[must_use]
132 pub fn as_compact_iri(&self) -> &CompactIri {
133 unsafe { CompactIri::new_unchecked(&self.0) }
134 }
135
136 #[must_use]
139 pub fn into_iri_ref(self) -> IriRefBuf {
140 unsafe { IriRefBuf::new(self.0).unwrap_unchecked() }
142 }
143
144 #[must_use]
146 pub fn into_string(self) -> String {
147 self.0
148 }
149}
150
151impl std::borrow::Borrow<CompactIri> for CompactIriBuf {
152 fn borrow(&self) -> &CompactIri {
153 self.as_compact_iri()
154 }
155}
156
157impl std::ops::Deref for CompactIriBuf {
158 type Target = CompactIri;
159
160 fn deref(&self) -> &CompactIri {
161 self.as_compact_iri()
162 }
163}