2323from copy import deepcopy
2424from enum import Enum
2525import fnmatch , re
26+ import json
2627
2728
2829INDENT = " " # doc is indented by four spaces
@@ -632,4 +633,51 @@ def trim_by_pattern(argdict: dict, pattern: str,
632633 f"following reserved names: { ', ' .join (conflict )} " )
633634 unrequired = list (filter (rem .match , argdict .keys ()))
634635 for key in unrequired :
635- argdict .pop (key )
636+ argdict .pop (key )
637+
638+
639+ class ArgumentEncoder (json .JSONEncoder ):
640+ """Extended JSON Encoder to encode Argument object:
641+
642+ Examples
643+ --------
644+ >>> json.dumps(some_arg, cls=ArgumentEncoder)
645+ """
646+ def default (self , obj ) -> Dict [str , Union [str , bool , List ]]:
647+ """Generate a dict containing argument information, making it ready to be encoded
648+ to JSON string.
649+
650+ Note
651+ ----
652+ All object in the dict should be JSON serializable.
653+
654+ Returns
655+ -------
656+ dict: Dict
657+ a dict containing argument information
658+ """
659+ if isinstance (obj , Argument ):
660+ return {
661+ "object" : "Argument" ,
662+ "name" : obj .name ,
663+ "type" : obj .dtype ,
664+ "optional" : obj .optional ,
665+ "alias" : obj .alias ,
666+ "doc" : obj .doc ,
667+ "repeat" : obj .repeat ,
668+ "sub_fields" : obj .sub_fields ,
669+ "sub_variants" : obj .sub_variants ,
670+ }
671+ elif isinstance (obj , Variant ):
672+ return {
673+ "object" : "Variant" ,
674+ "flag_name" : obj .flag_name ,
675+ "optional" : obj .optional ,
676+ "default_tag" : obj .default_tag ,
677+ "choice_dict" : obj .choice_dict ,
678+ "choice_alias" : obj .choice_alias ,
679+ "doc" : obj .doc ,
680+ }
681+ elif isinstance (obj , type ):
682+ return obj .__name__
683+ return json .JSONEncoder .default (self , obj )
0 commit comments