| 1 | //! Define PyStubType for built-in types based on <https://pyo3.rs/v0.22.2/conversions/tables#argument-types> |
| 2 | |
| 3 | use crate::stub_type::*; |
| 4 | use std::{ |
| 5 | borrow::Cow, |
| 6 | ffi::{OsStr, OsString}, |
| 7 | path::PathBuf, |
| 8 | time::SystemTime, |
| 9 | }; |
| 10 | |
| 11 | use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime, TimeZone, Utc}; |
| 12 | |
| 13 | macro_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 | |
| 23 | macro_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: |
| 34 | impl PyStubType for () { |
| 35 | fn type_output() -> TypeInfo { |
| 36 | TypeInfo::none() |
| 37 | } |
| 38 | } |
| 39 | impl_builtin!(bool, "bool" ); |
| 40 | impl_builtin!(u8, "int" ); |
| 41 | impl_builtin!(u16, "int" ); |
| 42 | impl_builtin!(u32, "int" ); |
| 43 | impl_builtin!(u64, "int" ); |
| 44 | impl_builtin!(u128, "int" ); |
| 45 | impl_builtin!(usize, "int" ); |
| 46 | impl_builtin!(i8, "int" ); |
| 47 | impl_builtin!(i16, "int" ); |
| 48 | impl_builtin!(i32, "int" ); |
| 49 | impl_builtin!(i64, "int" ); |
| 50 | impl_builtin!(i128, "int" ); |
| 51 | impl_builtin!(isize, "int" ); |
| 52 | impl_builtin!(f32, "float" ); |
| 53 | impl_builtin!(f64, "float" ); |
| 54 | impl_builtin!(num_complex::Complex32, "complex" ); |
| 55 | impl_builtin!(num_complex::Complex64, "complex" ); |
| 56 | |
| 57 | impl_builtin!(char, "str" ); |
| 58 | impl_builtin!(&str, "str" ); |
| 59 | impl_builtin!(OsStr, "str" ); |
| 60 | impl_builtin!(String, "str" ); |
| 61 | impl_builtin!(OsString, "str" ); |
| 62 | impl_builtin!(Cow<'_, str>, "str" ); |
| 63 | impl_builtin!(Cow<'_, OsStr>, "str" ); |
| 64 | impl_builtin!(Cow<'_, [u8]>, "bytes" ); |
| 65 | |
| 66 | impl PyStubType for PathBuf { |
| 67 | fn type_output() -> TypeInfo { |
| 68 | TypeInfo::builtin(name:"str" ) |
| 69 | } |
| 70 | fn type_input() -> TypeInfo { |
| 71 | TypeInfo::builtin(name:"str" ) |
| 72 | | TypeInfo::with_module(name:"os.PathLike" , module:"os" .into()) |
| 73 | | TypeInfo::with_module(name:"pathlib.Path" , module:"pathlib" .into()) |
| 74 | } |
| 75 | } |
| 76 | |
| 77 | impl<Tz: TimeZone> PyStubType for DateTime<Tz> { |
| 78 | fn type_output() -> TypeInfo { |
| 79 | TypeInfo::with_module(name:"datetime.datetime" , module:"datetime" .into()) |
| 80 | } |
| 81 | } |
| 82 | |
| 83 | impl_with_module!(SystemTime, "datetime.datetime" , "datetime" ); |
| 84 | impl_with_module!(NaiveDateTime, "datetime.datetime" , "datetime" ); |
| 85 | impl_with_module!(NaiveDate, "datetime.date" , "datetime" ); |
| 86 | impl_with_module!(NaiveTime, "datetime.time" , "datetime" ); |
| 87 | impl_with_module!(FixedOffset, "datetime.tzinfo" , "datetime" ); |
| 88 | impl_with_module!(Utc, "datetime.tzinfo" , "datetime" ); |
| 89 | impl_with_module!(std::time::Duration, "datetime.timedelta" , "datetime" ); |
| 90 | impl_with_module!(chrono::Duration, "datetime.timedelta" , "datetime" ); |
| 91 | |