1 | use crate::{generate::*, type_info::*, TypeInfo}; |
2 | use std::fmt; |
3 | |
4 | /// Definition of a Python function. |
5 | #[derive (Debug, Clone, PartialEq)] |
6 | pub struct FunctionDef { |
7 | pub name: &'static str, |
8 | pub args: Vec<Arg>, |
9 | pub r#return: TypeInfo, |
10 | pub doc: &'static str, |
11 | } |
12 | |
13 | impl Import for FunctionDef { |
14 | fn import(&self) -> HashSet<ModuleRef> { |
15 | let mut import: HashSet = self.r#return.import.clone(); |
16 | for arg: &Arg in &self.args { |
17 | import.extend(arg.import().into_iter()); |
18 | } |
19 | import |
20 | } |
21 | } |
22 | |
23 | impl From<&PyFunctionInfo> for FunctionDef { |
24 | fn from(info: &PyFunctionInfo) -> Self { |
25 | Self { |
26 | name: info.name, |
27 | args: info.args.iter().map(Arg::from).collect(), |
28 | r#return: (info.r#return)(), |
29 | doc: info.doc, |
30 | } |
31 | } |
32 | } |
33 | |
34 | impl fmt::Display for FunctionDef { |
35 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
36 | write!(f, "def {}(" , self.name)?; |
37 | for (i, arg) in self.args.iter().enumerate() { |
38 | write!(f, " {}" , arg)?; |
39 | if i != self.args.len() - 1 { |
40 | write!(f, ", " )?; |
41 | } |
42 | } |
43 | writeln!(f, ") -> {}:" , self.r#return)?; |
44 | |
45 | let doc = self.doc; |
46 | let indent = indent(); |
47 | if !doc.is_empty() { |
48 | writeln!(f, r#" {indent}r""""# )?; |
49 | for line in doc.lines() { |
50 | writeln!(f, " {indent}{}" , line)?; |
51 | } |
52 | writeln!(f, r#" {indent}""""# )?; |
53 | } |
54 | writeln!(f, " {indent}..." )?; |
55 | writeln!(f)?; |
56 | Ok(()) |
57 | } |
58 | } |
59 | |