1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//! # temps
//!
//! A natural language time expression parser for Rust.
//!
//! This crate provides a unified interface for parsing human-readable time expressions
//! like "in 5 minutes", "tomorrow at 3pm", or "next Monday" into concrete datetime
//! values. It supports multiple datetime backends through feature flags.
//!
//! ## Features
//!
//! - **Natural language parsing**: Parse expressions like "in 2 hours", "yesterday", "next Friday"
//! - **Multiple languages**: Currently supports English and German
//! - **Backend flexibility**: Choose between chrono and jiff datetime libraries
//! - **Type-safe**: Strong typing for time units, directions, and expressions
//! - **Comprehensive error handling**: Detailed error types for debugging
//!
//! ## Quick Start
//!
//! Add to your `Cargo.toml`:
//!
//! ```toml
//! [dependencies]
//! temps = { version = "3", features = ["chrono"] }
//! # or
//! temps = { version = "3", features = ["jiff"] }
//! ```
//!
//! ## Examples
//!
//! ### Using with chrono
//!
//! ```rust
//! # #[cfg(feature = "chrono")] {
//! use temps::chrono::{parse_to_datetime, Language};
//!
//! let dt = parse_to_datetime("in 30 minutes", Language::English).unwrap();
//! println!("In 30 minutes: {}", dt);
//!
//! let dt = parse_to_datetime("morgen um 15:30", Language::German).unwrap();
//! println!("Tomorrow at 15:30: {}", dt);
//! # }
//! ```
//!
//! ### Using with jiff
//!
//! ```rust
//! # #[cfg(feature = "jiff")] {
//! use temps::jiff::{parse_to_zoned, Language};
//!
//! let dt = parse_to_zoned("next Monday at 9:00 am", Language::English).unwrap();
//! println!("Next Monday at 9:00 am: {}", dt);
//! # }
//! ```
//!
//! ### Lower-level API
//!
//! ```rust
//! # #[cfg(feature = "chrono")] {
//! use temps::chrono::{parse, Language, TimeExpression, ChronoProvider, TimeParser};
//!
//! // Parse to an expression first
//! let expr = parse("in 2 hours", Language::English).unwrap();
//!
//! // Then convert to datetime
//! let provider = ChronoProvider;
//! let dt = provider.parse_expression(expr).unwrap();
//! # }
//! ```
//!
//! ## Supported Expressions
//!
//! ### Relative Time
//! - "in 5 minutes" / "in 5 Minuten"
//! - "2 hours ago" / "vor 2 Stunden"
//! - "in 3 days" / "in 3 Tagen"
//!
//! ### Day References
//! - "today" / "heute"
//! - "tomorrow" / "morgen"
//! - "yesterday" / "gestern"
//! - "next Monday" / "nächsten Montag"
//! - "last Friday" / "letzten Freitag"
//!
//! ### Absolute Times
//! - "3:30 pm" / "15:30"
//! - "tomorrow at 10:00 am" / "morgen um 10:00"
//! - "2024-12-25T15:30:00Z" (ISO format)
//!
//! ## Feature Flags
//!
//! - `chrono`: Enable chrono datetime backend
//! - `jiff`: Enable jiff datetime backend
//!
//! At least one backend must be enabled.
/// Chrono backend support.
///
/// This module is available when the `chrono` feature is enabled.
/// It provides chrono-specific types and functions for parsing time expressions
/// into `chrono::DateTime<Local>` values.
///
/// This module re-exports all necessary types for using temps with chrono.
/// Jiff backend support.
///
/// This module is available when the `jiff` feature is enabled.
/// It provides jiff-specific types and functions for parsing time expressions
/// into `jiff::Zoned` values.
///
/// This module re-exports all necessary types for using temps with jiff.