@@ -10,22 +10,34 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
1010 let module = _pyexpat:: make_module ( vm) ;
1111
1212 extend_module ! ( vm, module, {
13- "errors" => _errors:: make_module( vm) ,
14- "model" => _model:: make_module( vm)
13+ "errors" => _errors:: make_module( vm) ,
14+ "model" => _model:: make_module( vm) ,
1515 } ) ;
1616
1717 module
1818}
1919
20+ macro_rules! create_property {
21+ ( $ctx: expr, $attributes: expr, $name: expr, $element: ident) => {
22+ let attr = $ctx. new_getset(
23+ $name,
24+ move |this: & PyExpatLikeXmlParser | this. $element. read( ) . clone( ) ,
25+ move |this: & PyExpatLikeXmlParser , func: PyObjectRef | * this. $element. write( ) = func,
26+ ) ;
27+
28+ $attributes. insert( $name. to_owned( ) , attr) ;
29+ } ;
30+ }
31+
2032#[ pymodule( name = "pyexpat" ) ]
2133mod _pyexpat {
2234 use crate :: builtins:: { PyStr , PyStrRef , PyTypeRef } ;
2335 use crate :: byteslike:: PyBytesLike ;
2436 use crate :: function:: { IntoFuncArgs , OptionalArg } ;
2537 use crate :: pyobject:: StaticType ;
2638 use crate :: {
27- IntoPyObject , IntoPyRef , ItemProtocol , PyObjectRef , PyRef , PyResult , PyValue ,
28- TryFromObject , VirtualMachine ,
39+ ItemProtocol , PyContext , PyObjectRef , PyRef , PyResult , PyValue , TryFromObject ,
40+ VirtualMachine ,
2941 } ;
3042
3143 use rustpython_common:: lock:: PyRwLock ;
@@ -36,7 +48,7 @@ mod _pyexpat {
3648 #[ pyattr]
3749 #[ pyclass( name = "xmlparser" , module = false ) ]
3850 #[ derive( Debug ) ]
39- struct PyExpatLikeXmlParser {
51+ pub struct PyExpatLikeXmlParser {
4052 start_element : MutableObject ,
4153 end_element : MutableObject ,
4254 character_data : MutableObject ,
@@ -70,48 +82,14 @@ mod _pyexpat {
7082 . into_ref ( vm) )
7183 }
7284
73- #[ pyproperty( name = "StartElementHandler" ) ]
74- fn start_element_handler ( & self ) -> PyObjectRef {
75- self . start_element . read ( ) . clone ( )
76- }
77-
78- #[ pyproperty( setter, name = "StartElementHandler" ) ]
79- fn set_start_element_handler ( & self , func : PyObjectRef ) {
80- let mut handler = self . start_element . write ( ) ;
81- * handler = func;
82- }
83-
84- #[ pyproperty( name = "EndElementHandler" ) ]
85- fn end_element_handler ( & self ) -> PyObjectRef {
86- self . end_element . read ( ) . clone ( )
87- }
88-
89- #[ pyproperty( setter, name = "EndElementHandler" ) ]
90- fn set_end_element_handler ( & self , func : PyObjectRef ) {
91- let mut handler = self . end_element . write ( ) ;
92- * handler = func;
93- }
94-
95- #[ pyproperty( name = "CharacterDataHandler" ) ]
96- fn character_data_handler ( & self ) -> PyObjectRef {
97- self . character_data . read ( ) . clone ( )
98- }
99-
100- #[ pyproperty( setter, name = "CharacterDataHandler" ) ]
101- fn set_character_data_handler ( & self , func : PyObjectRef ) {
102- let mut handler = self . character_data . write ( ) ;
103- * handler = func;
104- }
105-
106- #[ pyproperty( name = "EntityDeclHandler" ) ]
107- fn entity_decl ( & self ) -> PyObjectRef {
108- self . entity_decl . read ( ) . clone ( )
109- }
85+ #[ extend_class]
86+ fn extend_class_with_fields ( ctx : & PyContext , class : & PyTypeRef ) {
87+ let mut attributes = class. attributes . write ( ) ;
11088
111- # [ pyproperty ( setter , name = "EntityDeclHandler" ) ]
112- fn set_decl_handler ( & self , func : PyObjectRef ) {
113- let mut handler = self . entity_decl . write ( ) ;
114- * handler = func ;
89+ create_property ! ( ctx , attributes , "StartElementHandler" , start_element ) ;
90+ create_property ! ( ctx , attributes , "EndElementHandler" , end_element ) ;
91+ create_property ! ( ctx , attributes , "CharacterDataHandler" , character_data ) ;
92+ create_property ! ( ctx , attributes , "EntityDeclHandler" , entity_decl ) ;
11593 }
11694
11795 fn create_config ( & self ) -> xml:: ParserConfig {
0 commit comments