pyo3_stub_gen/stub_type/
builtins.rs1use crate::stub_type::*;
4use std::{
5 borrow::Cow,
6 ffi::{OsStr, OsString},
7 path::PathBuf,
8 rc::Rc,
9 sync::Arc,
10 time::SystemTime,
11};
12
13macro_rules! impl_builtin {
14 ($ty:ty, $pytype:expr) => {
15 impl PyStubType for $ty {
16 fn type_output() -> TypeInfo {
17 TypeInfo::builtin($pytype)
18 }
19 }
20 };
21}
22
23macro_rules! impl_with_module {
24 ($ty:ty, $pytype:expr, $module:expr) => {
25 impl PyStubType for $ty {
26 fn type_output() -> TypeInfo {
27 TypeInfo::with_module($pytype, $module.into())
28 }
29 }
30 };
31}
32
33impl PyStubType for () {
35 fn type_output() -> TypeInfo {
36 TypeInfo::none()
37 }
38}
39impl_builtin!(bool, "bool");
40impl_builtin!(u8, "int");
41impl_builtin!(u16, "int");
42impl_builtin!(u32, "int");
43impl_builtin!(u64, "int");
44impl_builtin!(u128, "int");
45impl_builtin!(usize, "int");
46impl_builtin!(i8, "int");
47impl_builtin!(i16, "int");
48impl_builtin!(i32, "int");
49impl_builtin!(i64, "int");
50impl_builtin!(i128, "int");
51impl_builtin!(isize, "int");
52impl_builtin!(f32, "float");
53impl_builtin!(f64, "float");
54impl_builtin!(num_complex::Complex32, "complex");
55impl_builtin!(num_complex::Complex64, "complex");
56
57impl_builtin!(char, "str");
58impl_builtin!(&str, "str");
59impl_builtin!(OsStr, "str");
60impl_builtin!(String, "str");
61impl_builtin!(OsString, "str");
62impl_builtin!(Cow<'_, str>, "str");
63impl_builtin!(Cow<'_, OsStr>, "str");
64impl_builtin!(Cow<'_, [u8]>, "bytes");
65
66#[cfg(feature = "ordered-float")]
67mod impl_ordered_float {
68 use super::*;
69 impl_builtin!(ordered_float::NotNan<f32>, "float");
70 impl_builtin!(ordered_float::NotNan<f64>, "float");
71 impl_builtin!(ordered_float::OrderedFloat<f32>, "float");
72 impl_builtin!(ordered_float::OrderedFloat<f64>, "float");
73}
74
75impl PyStubType for PathBuf {
76 fn type_output() -> TypeInfo {
77 TypeInfo::with_module("pathlib.Path", "pathlib".into())
78 }
79 fn type_input() -> TypeInfo {
80 TypeInfo::builtin("str")
81 | TypeInfo::with_module("os.PathLike", "os".into())
82 | TypeInfo::with_module("pathlib.Path", "pathlib".into())
83 }
84}
85
86impl<Tz: chrono::TimeZone> PyStubType for chrono::DateTime<Tz> {
87 fn type_output() -> TypeInfo {
88 TypeInfo::with_module("datetime.datetime", "datetime".into())
89 }
90}
91
92impl_with_module!(SystemTime, "datetime.datetime", "datetime");
93impl_with_module!(chrono::NaiveDateTime, "datetime.datetime", "datetime");
94impl_with_module!(chrono::NaiveDate, "datetime.date", "datetime");
95impl_with_module!(chrono::NaiveTime, "datetime.time", "datetime");
96impl_with_module!(chrono::FixedOffset, "datetime.tzinfo", "datetime");
97impl_with_module!(chrono::Utc, "datetime.tzinfo", "datetime");
98impl_with_module!(std::time::Duration, "datetime.timedelta", "datetime");
99impl_with_module!(chrono::Duration, "datetime.timedelta", "datetime");
100impl_with_module!(time::Duration, "datetime.timedelta", "datetime");
101impl_with_module!(time::Date, "datetime.date", "datetime");
102impl_with_module!(time::OffsetDateTime, "datetime.datetime", "datetime");
103impl_with_module!(time::PrimitiveDateTime, "datetime.datetime", "datetime");
104impl_with_module!(time::UtcDateTime, "datetime.datetime", "datetime");
105impl_with_module!(time::Time, "datetime.time", "datetime");
106impl_with_module!(time::UtcOffset, "datetime.tzinfo", "datetime");
107
108impl<T: PyStubType> PyStubType for &T {
109 fn type_input() -> TypeInfo {
110 T::type_input()
111 }
112 fn type_output() -> TypeInfo {
113 T::type_output()
114 }
115}
116
117impl<T: PyStubType> PyStubType for Rc<T> {
118 fn type_input() -> TypeInfo {
119 T::type_input()
120 }
121 fn type_output() -> TypeInfo {
122 T::type_output()
123 }
124}
125
126impl<T: PyStubType> PyStubType for Arc<T> {
127 fn type_input() -> TypeInfo {
128 T::type_input()
129 }
130 fn type_output() -> TypeInfo {
131 T::type_output()
132 }
133}