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
// =============================================================================
// Copyright (c) 2025 - 2026 Haixing Hu.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0.
// =============================================================================
//! Runtime data type descriptors and policy-driven conversion utilities.
//!
//! The default feature set is empty and exposes the lightweight [`DataType`]
//! vocabulary plus [`DataTypeOf`]. Optional `chrono`, `big-number`, `url`, and
//! `json` features add mappings for external types. The `converter` feature
//! enables core scalar, string, and Duration conversions. Combine it with a
//! rich-type feature to enable conversions for that family, or use `all`.
//!
//! # Conversion contract
//!
//! With `converter`, strings can target fixed-width numeric, boolean,
//! character, and Duration values. Fixed-width integers can target numeric,
//! boolean, and Duration values; floats can target fixed-width numeric values;
//! Duration can target fixed-width integers and String. `chrono`,
//! `big-number`, `url`, and `json` add their corresponding source and target
//! conversions when combined with `converter`; JSON also enables StringMap
//! parsing and formatting. Other type pairs return
//! `DataConversionError::Unsupported`.
//!
//! Numeric conversion defaults to `NumericConversionPolicy::Exact`, which
//! rejects truncation, rounding, and precision loss. Explicit `Lossy` mode
//! permits finite decimal/float truncation toward zero, integer-to-float IEEE
//! rounding, and Duration half-up rounding. Duration-to-integer and
//! Duration-to-String require exact divisibility in Exact mode.
//!
//! Strings are not trimmed by default and are normalized exactly once.
//! Boolean text defaults to `true` and `false`; numeric 0/1 handling is
//! controlled independently by `BooleanNumericPolicy`. Duration text uses
//! `[0-9]+(ns|us|µs|μs|ms|s|m|h|d)?`.
//!
//! # Example
//!
//! ```
//! # #[cfg(feature = "converter")]
//! # {
//! use qubit_datatype::{
//! DataConversionError, InvalidValueReason, DataConversionOptions,
//! DataConverter,
//! };
//!
//! assert!(matches!(
//! DataConverter::from("3.9").to::<i32>(),
//! Err(DataConversionError::InvalidValue {
//! reason: InvalidValueReason::PrecisionLoss,
//! ..
//! }),
//! ));
//!
//! let lossy = DataConversionOptions::lossy();
//! assert_eq!(DataConverter::from(" 3.9 ").to_with::<i32>(&lossy), Ok(3));
//! # }
//! ```
/// Data type descriptors and compile-time type mappings.
/// Runtime value conversion utilities.
pub use ;
pub use ;