Skip to content

Commit

Permalink
support validate attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
iwate committed Feb 28, 2020
1 parent 6458686 commit a7eef4e
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 29 deletions.
62 changes: 41 additions & 21 deletions src/Aiplugs.PoshApp/Services/Powershell/PowershellExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,45 +78,69 @@ public static IEnumerable<PSParameterInfo> GetParameters(this PowerShell ps, str
var validateCountAttr = (AttributeAst)paramAst.Attributes.FirstOrDefault(attr => attr.TypeName.Name == "ValidateCount");
if (validateCountAttr != null)
{
if (validateCountAttr.PositionalArguments.Count > 0)
info.ValidateCount = new[] { ExtractInt(validateCountAttr, 0), ExtractInt(validateCountAttr, 1) };

if (validateCountAttr.NamedArguments.Count > 0)
info.ValidateCount = new[] { ExtractInt(validateCountAttr, "MinLength"), ExtractInt(validateCountAttr, "MaxLength") };
}

var validateLengthAttr = (AttributeAst)paramAst.Attributes.FirstOrDefault(attr => attr.TypeName.Name == "ValidateLength");
if (validateLengthAttr != null)
{
if (validateLengthAttr.PositionalArguments.Count > 0)
info.ValidateLength = new[] { ExtractInt(validateLengthAttr, 0), ExtractInt(validateLengthAttr, 1) };

if (validateLengthAttr.NamedArguments.Count > 0)
info.ValidateLength = new[] { ExtractInt(validateLengthAttr, "MinLength"), ExtractInt(validateLengthAttr, "MaxLength") };
}

var validateRangeAttr = (AttributeAst)paramAst.Attributes.FirstOrDefault(attr => attr.TypeName.Name == "ValidateRange");
if (validateRangeAttr != null)
{
if (validateRangeAttr.PositionalArguments.Count > 0)
info.ValidateRange = new[] { ExtractLong(validateRangeAttr, 0), ExtractLong(validateRangeAttr, 1) };

if (validateRangeAttr.NamedArguments.Count > 0)
info.ValidateRange = new[] { ExtractLong(validateRangeAttr, "MinRange"), ExtractLong(validateRangeAttr, "MaxRange") };
}

var validatePatternAttr = (AttributeAst)paramAst.Attributes.FirstOrDefault(attr => attr.TypeName.Name == "ValidatePattern");
if (validatePatternAttr != null)
{
info.ValidatePattern = ExtractString(validatePatternAttr, 0);
}

return info;
});
}
private static string ExtractString(AttributeAst attr, string paramName)
=> attr?.NamedArguments.FirstOrDefault(a => a.ArgumentName == paramName)?.Argument.Extent.Text;
{
return (string)attr?.NamedArguments.FirstOrDefault(a => a.ArgumentName == paramName)?.Argument.SafeGetValue();
}
private static string ExtractString(AttributeAst attr, int position)
{
return (string)attr?.PositionalArguments.ElementAtOrDefault(position)?.SafeGetValue();
}
private static bool ExtractBoolean(AttributeAst attr, string paramName)
{
var arg = attr?.NamedArguments.FirstOrDefault(a => a.ArgumentName == paramName);

if (arg == null)
return default(bool);

return Convert.ToBoolean(((VariableExpressionAst)arg.Argument).VariablePath.UserPath);
return Convert.ToBoolean(attr?.NamedArguments.FirstOrDefault(a => a.ArgumentName == paramName)?.Argument.SafeGetValue() ?? default(bool));
}
private static int ExtractInt(AttributeAst attr, string paramName)
{
var arg = attr?.NamedArguments.FirstOrDefault(a => a.ArgumentName == paramName);

if (arg == null)
return default(int);

return Convert.ToInt32(((VariableExpressionAst)arg.Argument).VariablePath.UserPath);
return (int)(attr?.NamedArguments.FirstOrDefault(a => a.ArgumentName == paramName)?.Argument.SafeGetValue() ?? default(int));
}
private static int ExtractInt(AttributeAst attr, int position)
{
return (int)(attr?.PositionalArguments.ElementAtOrDefault(position)?.SafeGetValue() ?? default(int));
}
private static long ExtractLong(AttributeAst attr, string paramName)
{
return Convert.ToInt64(attr?.NamedArguments.FirstOrDefault(a => a.ArgumentName == paramName)?.Argument.SafeGetValue() ?? default(long));
}
private static long ExtractLong(AttributeAst attr, int position)
{
return Convert.ToInt64(attr?.PositionalArguments.ElementAtOrDefault(position)?.SafeGetValue() ?? default(long));
}
}
public class PSParameterInfo
Expand All @@ -136,13 +160,9 @@ public class PSParameterInfo
public string DefaultParameterSetName { get; set; }
public string DefaultValue { get; set; }
public string[] ValidateSet { get;set; }
}

public class PSInvokeResult
{
public ICollection<PSObject> Output { get; } = new List<PSObject>();
public ICollection<PSObject> Information { get; } = new List<PSObject>();
public ICollection<PSObject> Warning { get; } = new List<PSObject>();
public ICollection<PSObject> Progress { get; } = new List<PSObject>();
public int[] ValidateCount { get; set; }
public int[] ValidateLength { get; set; }
public long[] ValidateRange { get; set; }
public string ValidatePattern { get; set; }
}
}
3 changes: 3 additions & 0 deletions src/Aiplugs.PoshApp/Services/Powershell/PowershellWorker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@ private async Task TryInvokeCommand(Runspace runspace)
p.ValueFromPipelineByPropertyName,
p.ValueFromRemainingArguments,
p.ValidateSet,
p.ValidateLength,
p.ValidateRange,
p.ValidatePattern,
Type = p.Type.FullName
}));
}
Expand Down
4 changes: 2 additions & 2 deletions src/Aiplugs.PoshApp/Views/Shared/Components/DateTime.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@
return { date: null, time: null };
const d = new Date(ticks);
const date = d ? `${d.getFullYear()}-${d.getMonth()+1}-${d.getDate()}` : null;
const time = d ? `${d.getHours()}:${d.getMinutes()}` : null;
const date = d ? `${d.getFullYear()}-${(d.getMonth() + 1).toString().padStart(2, '0')}-${d.getDate().toString().padStart(2, '0')}` : null;
const time = d ? `${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}` : null;
return { date, time };
},
handleInput(ev) {
Expand Down
38 changes: 32 additions & 6 deletions src/Aiplugs.PoshApp/Views/Shared/Pages/Parts/ParametersForm.cshtml
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
<template id="parameters-form">
<v-form>
<v-form v-model="valid">
<v-row>
<v-col class="pb-0" v-for="p in parameters" :key="p.name" :md="colSize(p)">
<datetime-field
v-model="p.value"
:label="p.name"
:hint="p.helpMessage"
:rules="rules(p)"
:disabled="disabledAll"
filled rounded dense
Expand All @@ -13,12 +14,14 @@
<v-select
v-model="p.value"
:label="p.name"
:hint="p.helpMessage"
:items="validateSet(p)"
v-else-if="p.validateSet">
</v-select>
<v-text-field
v-model="p.value"
:label="p.name"
:hint="p.helpMessage"
:type="inputType(p)"
:rules="rules(p)"
:disabled="disabledAll"
Expand All @@ -30,7 +33,7 @@
<v-col class="pb-0" style="height:92px;" v-if="!loadingParams&&(parameters.length==0||parameters.every(p => isNumberType(p.type)))">
</v-col>
<div class="pa-3 pb-0">
<v-btn text x-large :disabled="disabledAll" :loading="loading" v-on:click="emitRun">Run</v-btn>
<v-btn text x-large :disabled="disabledAll||!valid" :loading="loading" v-on:click="emitRun">Run</v-btn>
</div>
</v-row>
</v-form>
Expand All @@ -55,7 +58,7 @@
},
computed: {
disabledAll() {
return this.disable || !this.valid
return this.disabled || this.loadingParams
}
},
watch: {
Expand Down Expand Up @@ -97,9 +100,31 @@
},
rules(parameter) {
const rules = [];
if (parameter.mandatory) {
rules.push(v => !!v || `${parameter.name} is required.`);
const optional = function (f) {
return v => v === null || v === undefined || f(v);
}
if (parameter.mandatory)
rules.push(v => !!v || `${parameter.name} is required.`);
if (parameter.type == 'System.Int32'
|| parameter.type == 'System.Int64')
rules.push(optional(v => !isNaN(parseInt(v)) || `${parameter.name} need integer value`))
if (parameter.type == 'System.Float'
|| parameter.type == 'System.Double'
|| parameter.type == 'System.Decimal')
rules.push(optional(v => !isNaN(parseFloat(v)) || `${parameter.name} need number value`))
if (parameter.validateLength != null && parameter.validateLength.length == 2)
rules.push(optional(v => v && parameter.validateLength[0] <= v.length && v.length <= parameter.validateLength[1] || `${parameter.name} must be a string with a length between ${parameter.validateLength[0]} and ${parameter.validateLength[1]}.`))
if (parameter.validateRange != null && parameter.validateRange.length == 2)
rules.push(optional(v => parameter.validateRange[0] <= v && v <= parameter.validateRange[1] || `${parameter.name} need a number between ${parameter.validateRange[0]} and ${parameter.validateRange[1]}`))
if (parameter.validatePattern != null)
rules.push(optional(v => new RegExp(parameter.validatePattern).test(v) || `${parameter.name} need ${parameter.validatePattern}`))
return rules;
},
colSize(parameter) {
Expand All @@ -123,7 +148,8 @@
emitRun() {
this.$emit('run', this.getClixmls());
},
getParameters(){
getParameters() {
this.loadingParams = true;
this.$signalr.invoke('GetParameters', this.script);
}
},
Expand Down

0 comments on commit a7eef4e

Please sign in to comment.