python_ast/ast/tree/
keyword.rs1use proc_macro2::TokenStream;
2use pyo3::{Borrowed, FromPyObject, PyAny, PyResult, prelude::PyAnyMethods};
3use serde::{Deserialize, Serialize};
5
6use crate::{CodeGen, CodeGenContext, ExprType, PythonOptions, SymbolTableScopes, Node};
7
8#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
10pub struct Keyword {
11 pub arg: Option<String>,
13 pub value: ExprType,
15 pub lineno: Option<usize>,
17 pub col_offset: Option<usize>,
18 pub end_lineno: Option<usize>,
19 pub end_col_offset: Option<usize>,
20}
21
22impl<'a, 'py> FromPyObject<'a, 'py> for Keyword {
23 type Error = pyo3::PyErr;
24 fn extract(ob: Borrowed<'a, 'py, PyAny>) -> PyResult<Self> {
25 let arg = if let Ok(arg_attr) = ob.getattr("arg") {
26 if arg_attr.is_none() {
27 None
28 } else {
29 Some(arg_attr.extract()?)
30 }
31 } else {
32 None
33 };
34
35 let value: ExprType = ob.getattr("value")?.extract()?;
36
37 Ok(Self {
38 arg,
39 value,
40 lineno: ob.lineno(),
41 col_offset: ob.col_offset(),
42 end_lineno: ob.end_lineno(),
43 end_col_offset: ob.end_col_offset(),
44 })
45 }
46}
47
48impl CodeGen for Keyword {
49 type Context = CodeGenContext;
50 type Options = PythonOptions;
51 type SymbolTable = SymbolTableScopes;
52
53 fn to_rust(
54 self,
55 ctx: Self::Context,
56 options: Self::Options,
57 symbols: Self::SymbolTable,
58 ) -> Result<TokenStream, Box<dyn std::error::Error>> {
59 let value = self.value.to_rust(ctx, options, symbols)?;
60
61 if let Some(_keyword) = self.arg {
62 Ok(value)
67 } else {
68 Ok(value)
72 }
73 }
74}
75
76impl Node for Keyword {
77 fn lineno(&self) -> Option<usize> { self.lineno }
78 fn col_offset(&self) -> Option<usize> { self.col_offset }
79 fn end_lineno(&self) -> Option<usize> { self.end_lineno }
80 fn end_col_offset(&self) -> Option<usize> { self.end_col_offset }
81}