modifs.mineures sans commentaires
This commit is contained in:
		
							parent
							
								
									c7e6571c08
								
							
						
					
					
						commit
						8cbdf25372
					
				| @ -2,6 +2,8 @@ | ||||
| namespace nulib\app; | ||||
| 
 | ||||
| use nulib\A; | ||||
| use nulib\cl; | ||||
| use nulib\cv; | ||||
| use nulib\str; | ||||
| 
 | ||||
| class args { | ||||
| @ -10,7 +12,10 @@ class args { | ||||
|    * - ["myArg" => $value]  devient  ["--my-arg", "$value"] | ||||
|    * - ["myOpt" => true]    devient  ["--my-opt"] | ||||
|    * - ["myOpt" => false]   est omis | ||||
|    * - les autres valeurs sont prises telles quelles | ||||
|    * - les autres valeurs sont transformées en chaines puis ajoutée | ||||
|    * | ||||
|    * ainsi, ["myOpt" => "value", "myArg", "myBool" => true] | ||||
|    * devient ["--my-opt", "value", "myArg", "--my-bool"] | ||||
|    */ | ||||
|   static function from_array(?array $array): array { | ||||
|     $args = []; | ||||
| @ -36,4 +41,120 @@ class args { | ||||
|     } | ||||
|     return $args; | ||||
|   } | ||||
| 
 | ||||
|   private static function tint(string $value): int { | ||||
|     return intval($value); | ||||
|   } | ||||
| 
 | ||||
|   private static function tbool(string $value): bool { | ||||
|     return boolval($value); | ||||
|   } | ||||
| 
 | ||||
|   private static function tarray(string $value): ?array { | ||||
|     if ($value === "") return null; | ||||
|     $tmparray = explode(",", $value); | ||||
|     $array = null; | ||||
|     foreach ($tmparray as $tmpvalue) { | ||||
|       [$tmpkey, $tmpvalue] = str::split_pair($tmpvalue); | ||||
|       if ($tmpvalue === null) cv::swap($tmpkey, $tmpvalue); | ||||
|       if ($tmpkey === null) { | ||||
|         $array[] = $tmpvalue; | ||||
|       } else { | ||||
|         if (str::del_suffix($tmpkey, ":int")) { | ||||
|           $tmpvalue = self::tint($tmpvalue); | ||||
|         } elseif (str::del_suffix($tmpkey, ":bool")) { | ||||
|           $tmpvalue = self::tbool($tmpvalue); | ||||
|         } | ||||
|         $array[$tmpkey] = $tmpvalue; | ||||
|       } | ||||
|     } | ||||
|     return $array; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * convertir une liste d'arguments de façon qu'ils soient utilisables pour un | ||||
|    * appel de méthode. les arguments peuvent être de la forme: | ||||
|    * - "name=value" | ||||
|    *   qui est stocké dans le tableau $query ["name" => "value"] | ||||
|    * - "+arg" | ||||
|    *   qui est stocké dans le tableau $query ["arg" => true] | ||||
|    * - "-arg" ou "~arg" | ||||
|    *   qui est stocké dans le tableau $query ["arg" => false] | ||||
|    * - "array:sval,key:aval,..." | ||||
|    *   qui devient l'argument ["sval", "key" => "aval", ...] | ||||
|    * - "int:value" | ||||
|    *   qui devient l'argument intval("value") | ||||
|    * - "bool:value" | ||||
|    *   qui devient l'argument boolval("value") | ||||
|    * - "value" | ||||
|    *   qui devient l'argument "value" | ||||
|    * | ||||
|    * à la fin, la liste des arguments est retournée [$arguments...] | ||||
|    * si le tableau $query est renseigné, il est en premier dans la liste des | ||||
|    * arguments e.g [$query, $arguments...] | ||||
|    */ | ||||
|   static function build_method_args(?array $args): ?array { | ||||
|     $query = null; | ||||
|     $margs = []; | ||||
|     $args ??= []; | ||||
|     foreach ($args as $arg) { | ||||
|       [$name, $value] = str::split_pair($arg, "="); | ||||
|       if ($value === null) { | ||||
|         if (str::del_prefix($name, "+")) { | ||||
|           $value = true; | ||||
|         } elseif (str::del_prefix($name, "-") || str::del_prefix($name, "~")) { | ||||
|           $value = false; | ||||
|         } elseif (str::del_prefix($name, "int:")) { | ||||
|           $margs[] = self::tint($name); | ||||
|           continue; | ||||
|         } elseif (str::del_prefix($name, "bool:")) { | ||||
|           $margs[] = self::tbool($name); | ||||
|           continue; | ||||
|         } elseif (str::del_prefix($name, "array:")) { | ||||
|           if (str::del_prefix($name, "int:")) { | ||||
|             $map = [self::class, "tint"]; | ||||
|           } elseif (str::del_prefix($name, "bool:")) { | ||||
|             $map = [self::class, "tbool"]; | ||||
|           } else { | ||||
|             $map = null; | ||||
|           } | ||||
|           $value = self::tarray($name); | ||||
|           if ($map !== null) $value = array_map($map, $value); | ||||
|           $margs[] = $value; | ||||
|           continue; | ||||
|         } else { | ||||
|           $margs[] = $name; | ||||
|           continue; | ||||
|         } | ||||
|       } | ||||
|       if (str::del_suffix($name, ":int")) { | ||||
|         if (str::del_suffix($name, ":array")) { | ||||
|           $value = array_map([self::class, "tint"], self::tarray($value)); | ||||
|         } else { | ||||
|           $value = self::tint($value); | ||||
|         } | ||||
|       } elseif (str::del_suffix($name, ":bool")) { | ||||
|         if (str::del_suffix($name, ":array")) { | ||||
|           $value = array_map([self::class, "tbool"], self::tarray($value)); | ||||
|         } else { | ||||
|           $value = self::tbool($value); | ||||
|         } | ||||
|       } elseif (str::del_suffix($name, ":array")) { | ||||
|         $value = self::tarray($value); | ||||
|         if (str::del_suffix($name, ":int")) { | ||||
|           $value = array_map([self::class, "tint"], $value); | ||||
|         } elseif (str::del_suffix($name, ":bool")) { | ||||
|           $value = array_map([self::class, "tbool"], $value); | ||||
|         } | ||||
|       } | ||||
|       if (cl::has($query, $name)) { | ||||
|         A::ensure_array($query[$name]); | ||||
|         $query[$name][] = $value; | ||||
|       } else { | ||||
|         $query[$name] = $value; | ||||
|       } | ||||
|     } | ||||
|     if ($query !== null) array_unshift($margs, $query); | ||||
|     return $margs; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -23,4 +23,49 @@ class argsTest extends TestCase { | ||||
| 
 | ||||
|     self::assertSame(["x", "1", "2", "3", "y"], args::from_array(["x", [1, 2, 3], "y"])); | ||||
|   } | ||||
| 
 | ||||
|   function testBuild_method_args() { | ||||
|     self::assertSame([], args::build_method_args(null)); | ||||
|     self::assertSame([], args::build_method_args([])); | ||||
| 
 | ||||
|     self::assertSame(["a"], args::build_method_args(["a"])); | ||||
|     self::assertSame(["a", "b"], args::build_method_args(["a", "b"])); | ||||
| 
 | ||||
|     self::assertSame([0], args::build_method_args(["int:0"])); | ||||
|     self::assertSame([42], args::build_method_args(["int:42"])); | ||||
|     # pour le moment, pas de tint
 | ||||
|     self::assertSame([0], args::build_method_args(["int:"])); | ||||
|     self::assertSame([0], args::build_method_args(["int:truc"])); | ||||
| 
 | ||||
|     self::assertSame([false], args::build_method_args(["bool:0"])); | ||||
|     self::assertSame([true], args::build_method_args(["bool:42"])); | ||||
|     self::assertSame([false], args::build_method_args(["bool:"])); | ||||
|     self::assertSame([true], args::build_method_args(["bool:truc"])); | ||||
|     # pour le moment, pas de tbool
 | ||||
|     self::assertSame([true], args::build_method_args(["bool:false"])); | ||||
|     self::assertSame([true], args::build_method_args(["bool:true"])); | ||||
| 
 | ||||
|     self::assertSame([["a", "b"]], args::build_method_args(["array:a,b"])); | ||||
|     self::assertSame([["x" => "a", "y" => "b"]], args::build_method_args(["array:x:a,y:b"])); | ||||
|     # pour le moment, pas de tint
 | ||||
|     self::assertSame([[0, 42, 0, 0]], args::build_method_args(["array:int:0,42,,truc"])); | ||||
|     self::assertSame([["x" => 0, "y" => 42]], args::build_method_args(["array:int:x:0,y:42"])); | ||||
|     # pour le moment, pas de tbool
 | ||||
|     self::assertSame([[false, true, false, true, true, true]], args::build_method_args(["array:bool:0,42,,truc,false,true"])); | ||||
|     self::assertSame([["x" => false, "y" => true]], args::build_method_args(["array:bool:x:0,y:42"])); | ||||
| 
 | ||||
|     self::assertSame([["a" => true]], args::build_method_args(["+a"])); | ||||
|     self::assertSame([["a" => false]], args::build_method_args(["-a"])); | ||||
|     self::assertSame([["a" => false]], args::build_method_args(["~a"])); | ||||
|     self::assertSame([["x" => "a"]], args::build_method_args(["x=a"])); | ||||
|     self::assertSame([["x" => 0]], args::build_method_args(["x:int=0"])); | ||||
|     self::assertSame([["x" => 42]], args::build_method_args(["x:int=42"])); | ||||
|     self::assertSame([["x" => false]], args::build_method_args(["x:bool=0"])); | ||||
|     self::assertSame([["x" => true]], args::build_method_args(["x:bool=42"])); | ||||
|     self::assertSame([["x" => ["a", "b"]]], args::build_method_args(["x:array=a,b"])); | ||||
|     self::assertSame([["x" => [0, 42]]], args::build_method_args(["x:array:int=0,42"])); | ||||
|     self::assertSame([["x" => [0, 42]]], args::build_method_args(["x:int:array=0,42"])); | ||||
| 
 | ||||
|     self::assertSame([["x" => "a", "y" => "b"], "a", "b"], args::build_method_args(["x=a", "a", "y=b", "b"])); | ||||
|   } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user