113 lines
4.4 KiB
C#
113 lines
4.4 KiB
C#
using System.Data;
|
|
using System.Text;
|
|
using SzCore.DataObjects;
|
|
|
|
namespace SzCore;
|
|
|
|
public class SzEvaluator
|
|
{
|
|
public async Task<SzResult<bool>> EvaluateDatasetAsync(SzDataset dataset, CancellationToken ct = default)
|
|
{
|
|
var errors = new StringBuilder();
|
|
|
|
var templateResult = await SZ.DataHandler.LoadTemplateAsync<SzDataObjectTemplate>(dataset.DataObjectTemplateId, ct);
|
|
if (!templateResult.IsSuccess || templateResult.Value is null)
|
|
return SzResult<bool>.Failure($"Template with id {dataset.DataObjectTemplateId} for Dataset ID {dataset.Id} could not be loaded: {templateResult.Error}");
|
|
|
|
foreach (var dataObject in dataset.DataObjects.Values)
|
|
{
|
|
var evalResult = EvaluateDataObject(dataObject, templateResult.Value);
|
|
if (!evalResult.IsSuccess) errors.Append(evalResult.Error);
|
|
}
|
|
|
|
var errString = errors.ToString();
|
|
return string.IsNullOrEmpty(errString) ? SzResult<bool>.Success(true) : SzResult<bool>.Failure(errString);
|
|
}
|
|
|
|
public SzResult<bool> EvaluateDataObject(SzDataObject dataObject, SzDataObjectTemplate template)
|
|
{
|
|
var errors = new StringBuilder();
|
|
|
|
foreach (var (key, templateField) in template.TemplateFields)
|
|
{
|
|
if (!dataObject.Fields.TryGetValue(key, out var matchingField))
|
|
{
|
|
errors.AppendLine($"Missing required field: '{key}'");
|
|
continue;
|
|
}
|
|
|
|
var templateMatchResult = DoesFieldMatchTemplateField(matchingField, templateField);
|
|
if (!templateMatchResult.IsSuccess) errors.Append(templateMatchResult.Error);
|
|
|
|
var evalResult = EvaluateFieldValue(matchingField);
|
|
if (!evalResult.IsSuccess) errors.Append(evalResult.Error);
|
|
}
|
|
|
|
foreach (var objectFieldKey in dataObject.Fields.Keys)
|
|
{
|
|
if (!template.TemplateFields.ContainsKey(objectFieldKey))
|
|
{
|
|
errors.AppendLine($"DataObject contains extra field '{objectFieldKey}' not found in template");
|
|
}
|
|
}
|
|
|
|
var errString = errors.ToString().Trim();
|
|
return string.IsNullOrEmpty(errString) ? SzResult<bool>.Success(true) : SzResult<bool>.Failure(errString);
|
|
}
|
|
|
|
public SzResult<bool> DoesFieldMatchTemplateField(SzField field, SzTemplateField templateField)
|
|
{
|
|
var errors = new StringBuilder();
|
|
|
|
if (field.Id != templateField.Id) errors.AppendLine($"Field ID mismatch for '{field.Id}': Expected {templateField.Id}");
|
|
if (field.FieldType != templateField.FieldType) errors.AppendLine($"Field '{field.Id}' type mismatch: Expected {templateField.FieldType}, got {field.FieldType}");
|
|
if (field.IsList != templateField.IsList) errors.AppendLine($"Field '{field.Id}' IsList mismatch: Expected {templateField.IsList}");
|
|
|
|
var errString = errors.ToString().Trim();
|
|
return string.IsNullOrEmpty(errString) ? SzResult<bool>.Success(true) : SzResult<bool>.Failure(errString);
|
|
}
|
|
|
|
public SzResult<bool> EvaluateFieldValue(SzField field)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(field.Value))
|
|
return SzResult<bool>.Success(true);
|
|
|
|
var errors = new StringBuilder();
|
|
|
|
switch (field.FieldType)
|
|
{
|
|
case SzFieldType.Text:
|
|
break;
|
|
|
|
case SzFieldType.Number:
|
|
if (!float.TryParse(field.Value, out _))
|
|
{
|
|
errors.AppendLine($"Value '{field.Value}' in field '{field.Id}' is not a valid Number");
|
|
}
|
|
break;
|
|
|
|
case SzFieldType.Bool:
|
|
if (!bool.TryParse(field.Value, out _))
|
|
{
|
|
errors.AppendLine($"Value '{field.Value}' in field '{field.Id}' is not a valid Boolean");
|
|
}
|
|
break;
|
|
|
|
case SzFieldType.Formula:
|
|
errors.AppendLine($"Formula field type is not implemented yet. Field: {field.Id}");
|
|
break;
|
|
|
|
case SzFieldType.Reference:
|
|
errors.AppendLine($"Reference field type is not implemented yet. Field: {field.Id}");
|
|
break;
|
|
|
|
default:
|
|
errors.AppendLine($"Unsupported FieldType '{field.FieldType}' for field '{field.Id}'");
|
|
break;
|
|
}
|
|
|
|
var errString = errors.ToString().Trim();
|
|
return string.IsNullOrEmpty(errString) ? SzResult<bool>.Success(true) : SzResult<bool>.Failure(errString);
|
|
}
|
|
}
|