usingNewtonsoft.Json;usingNewtonsoft.Json.Linq;namespaceApp{publicclassInvalidScriptDefinitionException:Exception{publicInvalidScriptDefinitionException(stringmessage):base(message){}}publicrecordScriptDefinition{[JsonProperty("name")]publicstringName{get;}[JsonProperty("description")]publicstringDescription{get;}[JsonProperty("parameters")]publicIScriptParameter[]Parameters{get;}publicScriptDefinition(stringname,stringdescription,IScriptParameter[]parameters){Name=name;Description=description;Parameters=parameters;}publicstaticScriptDefinitionFromJson(stringjson){JObjectobj=JObject.Parse(json);stringname=obj["name"]?.Value<string>()??"";stringdescription=obj["description"]?.Value<string>()??"";varps=obj["parameters"]?.Value<JArray>()??[];varparameters=ps.Select<JToken,IScriptParameter>(parameter=>{vartype=parameter["type"]?.Value<string>();if(typeisnull){thrownewInvalidScriptDefinitionException($"The attribute \"type\" is required in the following JSON:{Environment.NewLine}{obj}");}if(type=="file"){returnScriptParameterFile.FromJson(parameter.ToString());}elseif(type=="files"){returnScriptParameterFiles.FromJson(parameter.ToString());}thrownewInvalidScriptDefinitionException($"Unknown type in the following JSON:{Environment.NewLine}{obj}");}).ToArray();returnnewScriptDefinition(name,description,parameters);}publicstringToJson(){returnJsonConvert.SerializeObject(this,Formatting.Indented);}}publicinterfaceIScriptParameter{stringName{get;}stringDescription{get;}stringToJson();}publicrecordScriptParameterFile:IScriptParameter{[JsonProperty("name")]publicstringName{get;}[JsonProperty("description")]publicstringDescription{get;}[JsonProperty("value")]publicstringValue{get;}publicScriptParameterFile(stringname,stringdescription,stringvalue){Name=name;Description=description;Value=value;}publicstaticScriptParameterFileFromJson(stringjson){JObjectobj=JObject.Parse(json);stringname=obj["name"]?.Value<string>()??"";stringdescription=obj["description"]?.Value<string>()??"";stringvalue=obj["value"]?.Value<string>()??"";returnnewScriptParameterFile(name,description,value);}publicstringToJson(){returnJsonConvert.SerializeObject(this,Formatting.Indented);}}publicrecordScriptParameterFiles:IScriptParameter{[JsonProperty("name")]publicstringName{get;}[JsonProperty("description")]publicstringDescription{get;}[JsonProperty("value")]publicstring[]Value{get;}publicScriptParameterFiles(stringname,stringdescription,string[]value){Name=name;Description=description;Value=value;}publicstaticScriptParameterFilesFromJson(stringjson){JObjectobj=JObject.Parse(json);stringname=obj["name"]?.Value<string>()??"";stringdescription=obj["description"]?.Value<string>()??"";string[]value=obj["value"]?.ToObject<string[]>()??[];returnnewScriptParameterFiles(name,description,value);}publicstringToJson(){returnJsonConvert.SerializeObject(this,Formatting.Indented);}}}