pyo3_stub_gen/stub_type/
builtins.rs

1//! Define PyStubType for built-in types based on <https://pyo3.rs/v0.22.2/conversions/tables#argument-types>
2
3use 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
33// NOTE:
34impl 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}