138 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\php;
 | |
| 
 | |
| use nur\A;
 | |
| use nur\data\types\Metadata;
 | |
| use nur\ref\ref_type;
 | |
| 
 | |
| class Autogen {
 | |
|   static function schema(array $schema): array {
 | |
|     $md = new Metadata($schema);
 | |
|     return $md->getSchema();
 | |
|   }
 | |
| 
 | |
|   static function auto_getters($schema, ?array $aliases=null): array {
 | |
|     $md = Metadata::with($schema);
 | |
|     $auto_getters = [];
 | |
|     foreach ($md->getKeys() as $key) {
 | |
|       $method_name = A::get($aliases, $key, $key);
 | |
|       $method = $md->getType($key)->getGetterName($method_name);
 | |
|       $auto_getters[$method] = $key;
 | |
|     }
 | |
|     return $auto_getters;
 | |
|   }
 | |
| 
 | |
|   static function auto_setters($schema, ?array $aliases=null): array {
 | |
|     $md = Metadata::with($schema);
 | |
|     $auto_setters = [];
 | |
|     foreach ($md->getKeys() as $key) {
 | |
|       $method_name = A::get($aliases, $key, $key);
 | |
|       $method = $md->getType($key)->getSetterName($method_name);
 | |
|       $auto_setters[$method] = $key;
 | |
|     }
 | |
|     return $auto_setters;
 | |
|   }
 | |
| 
 | |
|   static function auto_deleters($schema, ?array $aliases=null): array {
 | |
|     $md = Metadata::with($schema);
 | |
|     $auto_deleters = [];
 | |
|     foreach ($md->getKeys() as $key) {
 | |
|       $method_name = A::get($aliases, $key, $key);
 | |
|       $method = $md->getType($key)->getDeleterName($method_name);
 | |
|       $auto_deleters[$method] = $key;
 | |
|     }
 | |
|     return $auto_deleters;
 | |
|   }
 | |
| 
 | |
|   static function auto_ci_getters($schema, ?array $aliases=null): array {
 | |
|     $md = Metadata::with($schema);
 | |
|     $auto_getters = [];
 | |
|     foreach ($md->getCikeys() as $key) {
 | |
|       $method_name = A::get($aliases, $key, $key);
 | |
|       $method = $md->getType($key)->getGetterName($method_name);
 | |
|       $auto_getters[$method] = $key;
 | |
| 
 | |
|     }
 | |
|     return $auto_getters;
 | |
|   }
 | |
| 
 | |
|   static function auto_ci_setters($schema, ?array $aliases=null): array {
 | |
|     $md = Metadata::with($schema);
 | |
|     $auto_setters = [];
 | |
|     foreach ($md->getCikeys() as $key) {
 | |
|       $method_name = A::get($aliases, $key, $key);
 | |
|       $method = $md->getType($key)->getSetterName($method_name);
 | |
|       $auto_setters[$method] = $key;
 | |
|     }
 | |
|     return $auto_setters;
 | |
|   }
 | |
| 
 | |
|   static function fix_type(?string $phpType): array {
 | |
|     if ($phpType === null) return [null, null];
 | |
|     if (substr($phpType, 0, 1) == "?") {
 | |
|       $nullable = "?";
 | |
|       $ornull = "|null";
 | |
|       $phpType = substr($phpType, 1);
 | |
|     } else {
 | |
|       $nullable = "";
 | |
|       $ornull = "";
 | |
|     }
 | |
|     $array = "";
 | |
|     while (substr($phpType, -2, 2) == "[]") {
 | |
|       $array .= "[]";
 | |
|       $phpType = substr($phpType, 0, -2);
 | |
|     }
 | |
|     if (!in_array($phpType, ref_type::PHP_KNOWN_TYPES)) {
 | |
|       $phpType = "\\$phpType";
 | |
|     }
 | |
|     return ["$nullable$phpType$array", "$phpType$array$ornull"];
 | |
|   }
 | |
| 
 | |
|   static function auto_getters_methods($schema, ?array $aliases=null, ?string $class=null): array {
 | |
|     $md = Metadata::with($schema);
 | |
|     $class_methods = get_class_methods($class);
 | |
|     $auto_getters = array_merge(
 | |
|       self::auto_getters($md, $aliases),
 | |
|       self::auto_ci_getters($md, $aliases));
 | |
|     $methods = [];
 | |
|     foreach ($auto_getters as $method => $key) {
 | |
|       if ($class_methods !== null && in_array($method, $class_methods)) continue;
 | |
|       [$phpType, $returnType] = self::fix_type($md->getType($key)->getPhpType());
 | |
|       $method .= "()";
 | |
|       if ($phpType !== null) $method = "$returnType $method";
 | |
|       $methods[] = $method;
 | |
|     }
 | |
|     return $methods;
 | |
|   }
 | |
| 
 | |
|   static function auto_setters_methods($schema, ?array $aliases=null, ?string $class=null): array {
 | |
|     $md = Metadata::with($schema);
 | |
|     $class_methods = get_class_methods($class);
 | |
|     $auto_setters = array_merge(
 | |
|       self::auto_setters($md, $aliases),
 | |
|       self::auto_ci_setters($md, $aliases));
 | |
|     $methods = [];
 | |
|     foreach ($auto_setters as $method => $key) {
 | |
|       if ($class_methods !== null && in_array($method, $class_methods)) continue;
 | |
|       [$phpType, $returnType] = self::fix_type($md->getType($key)->getPhpType());
 | |
|       if ($phpType !== null) $method .= "($phpType \$value)";
 | |
|       else $method .= "(\$value)";
 | |
|       $methods[] = "void $method";
 | |
|     }
 | |
|     return $methods;
 | |
|   }
 | |
| 
 | |
|   static function auto_deleters_methods($schema, ?array $aliases=null, ?string $class=null): array {
 | |
|     $md = Metadata::with($schema);
 | |
|     $class_methods = get_class_methods($class);
 | |
|     $auto_deleters = self::auto_deleters($md, $aliases);
 | |
|     $methods = [];
 | |
|     foreach ($auto_deleters as $method => $key) {
 | |
|       if ($class_methods !== null && in_array($method, $class_methods)) continue;
 | |
|       $method .= "()";
 | |
|       $methods[] = "void $method";
 | |
|     }
 | |
|     return $methods;
 | |
|   }
 | |
| }
 |