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 time::SystemTime,
9};
10
11use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime, TimeZone, Utc};
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
66impl 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
77impl<Tz: TimeZone> PyStubType for DateTime<Tz> {
78 fn type_output() -> TypeInfo {
79 TypeInfo::with_module(name:"datetime.datetime", module:"datetime".into())
80 }
81}
82
83impl_with_module!(SystemTime, "datetime.datetime", "datetime");
84impl_with_module!(NaiveDateTime, "datetime.datetime", "datetime");
85impl_with_module!(NaiveDate, "datetime.date", "datetime");
86impl_with_module!(NaiveTime, "datetime.time", "datetime");
87impl_with_module!(FixedOffset, "datetime.tzinfo", "datetime");
88impl_with_module!(Utc, "datetime.tzinfo", "datetime");
89impl_with_module!(std::time::Duration, "datetime.timedelta", "datetime");
90impl_with_module!(chrono::Duration, "datetime.timedelta", "datetime");
91