pub enum Edtf {
Date(Date),
DateTime(DateTime),
Interval(Interval),
Set(Set),
}Expand description
Any parsed EDTF expression.
Variants§
Date(Date)
A single date.
DateTime(DateTime)
A date with time of day (level 0 only).
Interval(Interval)
A time interval.
Set(Set)
A set of dates (level 2).
Implementations§
Source§impl Edtf
impl Edtf
Sourcepub fn values(&self) -> Result<Values, Unenumerable>
pub fn values(&self) -> Result<Values, Unenumerable>
Enumerate the concrete calendar values this expression denotes, each at its own precision (decisions D24–D29 in docs/spec-notes.md).
The iterator is lazy — state is proportional to the number of set
elements, never to the number of values — so pathological
cardinalities (XXXX-XX-XX denotes ~3.65 million days) stream
without allocation. Errors are structural and complete at
construction: iteration itself cannot fail.
use edtf_core::Edtf;
// ISO 8601-2 §6.4 Example 1, expanded exactly as the spec does:
let set = Edtf::parse("{1667,1668,1670..1672}").unwrap();
let years: Vec<String> = set.values().unwrap().map(|v| v.to_string()).collect();
assert_eq!(years, ["1667", "1668", "1670", "1671", "1672"]);
// Unspecified digits enumerate their valid completions (§9.2.2):
let masked = Edtf::parse("1985-0X-31").unwrap();
let months: Vec<String> = masked.values().unwrap().map(|v| v.to_string()).collect();
assert_eq!(
months,
[
"1985-01-31",
"1985-03-31",
"1985-05-31",
"1985-07-31",
"1985-08-31"
]
);
// Intervals denote one extent, not a collection:
assert!(Edtf::parse("2004/2005").unwrap().values().is_err());§Errors
Unenumerable when the value denotes no finite collection: an
interval, a set with an unbounded ..date/date.. element, or a
year sweep beyond the numeric range this library computes with.
Source§impl Edtf
impl Edtf
Sourcepub fn relation(&self, other: &Self) -> Relations
pub fn relation(&self, other: &Self) -> Relations
The three-valued temporal relation between this expression and
other, computed over the two Edtf::bounds regions (see the
semantics note in this module’s documentation).
use edtf_core::{Edtf, Modality, Relation};
let a = Edtf::parse("1985~").unwrap();
let b = Edtf::parse("199X").unwrap();
assert_eq!(a.relation(&b).definite(), Some(Relation::Before));
let c = Edtf::parse("198X").unwrap();
let d = Edtf::parse("1985").unwrap();
// 198X may fall before, on, after or around 1985 — nothing asserted.
assert_eq!(c.relation(&d).definite(), None);
assert!(c.relation(&d).is_possible(Relation::Before));
assert!(c.relation(&d).is_possible(Relation::After));
assert!(c.relation(&d).is_possible(Relation::Contains));Source§impl Edtf
impl Edtf
Sourcepub fn parse(input: &str) -> Result<Self, ParseError>
pub fn parse(input: &str) -> Result<Self, ParseError>
Parse an EDTF string (levels 0–2, ISO 8601-2:2019 Annex A).
§Errors
ParseError with a byte offset and message pointing at the first
place the input stops being valid EDTF.
Sourcepub fn level(&self) -> u8
pub fn level(&self) -> u8
The minimum EDTF conformance level (0, 1 or 2) able to express this
value. Semantically equivalent spellings classify identically: e.g.
?1985-?04-?12 reports level 1 because 1985-04-12? means the same.
Sourcepub fn is_uncertain(&self) -> bool
pub fn is_uncertain(&self) -> bool
True if any component anywhere is marked uncertain (? or %).
Sourcepub fn is_approximate(&self) -> bool
pub fn is_approximate(&self) -> bool
True if any component anywhere is marked approximate (~ or %).
Sourcepub fn has_unspecified(&self) -> bool
pub fn has_unspecified(&self) -> bool
True if any component anywhere contains an unspecified digit (X).