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