mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-10-30 23:47:33 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import itertools
 | |
| 
 | |
| 
 | |
| def generate_errors(errors, f):
 | |
|     # Exact/regex match to create {CODE: ErrorClassName}
 | |
|     exact_match = []
 | |
|     regex_match = []
 | |
| 
 | |
|     # Find out what subclasses to import and which to create
 | |
|     import_base, create_base = set(), {}
 | |
|     for error in errors:
 | |
|         if error.subclass_exists:
 | |
|             import_base.add(error.subclass)
 | |
|         else:
 | |
|             create_base[error.subclass] = error.int_code
 | |
| 
 | |
|         if error.has_captures:
 | |
|             regex_match.append(error)
 | |
|         else:
 | |
|             exact_match.append(error)
 | |
| 
 | |
|     # Imports and new subclass creation
 | |
|     f.write('from .rpc_base_errors import RPCError, {}\n'
 | |
|             .format(", ".join(sorted(import_base))))
 | |
| 
 | |
|     for cls, int_code in sorted(create_base.items(), key=lambda t: t[1]):
 | |
|         f.write('\n\nclass {}(RPCError):\n    code = {}\n'
 | |
|                 .format(cls, int_code))
 | |
| 
 | |
|     # Error classes generation
 | |
|     for error in errors:
 | |
|         f.write('\n\nclass {}({}):\n    def __init__(self, **kwargs):\n'
 | |
|                 '        '.format(error.name, error.subclass))
 | |
| 
 | |
|         if error.has_captures:
 | |
|             f.write("self.{} = int(kwargs.get('capture', 0))\n        "
 | |
|                     .format(error.capture_name))
 | |
| 
 | |
|         f.write('super(Exception, self).__init__({}'
 | |
|                 .format(repr(error.description)))
 | |
| 
 | |
|         if error.has_captures:
 | |
|             f.write('.format(self.{})'.format(error.capture_name))
 | |
| 
 | |
|         f.write(')\n')
 | |
| 
 | |
|     # Create the actual {CODE: ErrorClassName} dict once classes are defined
 | |
|     # TODO Actually make a difference between regex/exact
 | |
|     f.write('\n\nrpc_errors_all = {\n')
 | |
|     for error in itertools.chain(regex_match, exact_match):
 | |
|         f.write('    {}: {},\n'.format(repr(error.pattern), error.name))
 | |
|     f.write('}\n')
 |