Добавьте файлы проекта.
This commit is contained in:
106
SQLVision/Services/SqlCommentParser.cs
Normal file
106
SQLVision/Services/SqlCommentParser.cs
Normal file
@@ -0,0 +1,106 @@
|
||||
using SQLVision.Enums;
|
||||
using SQLVision.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace SQLVision.Services;
|
||||
|
||||
public sealed class SqlCommentParser
|
||||
{
|
||||
private static readonly Regex DescriptionRegex =
|
||||
new(@"--\s*@description\s+""(.+)""", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
private static readonly Regex ParamRegex =
|
||||
new(@"--\s*@param\s+(\w+)\s+(\w+)\s+""(.+?)""(?:\s+default=""(.*?)"")?(?:\s+@table\s+""(.+?)"")?(?:\s+dependsOn=""(.*?)"")?",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
private static readonly Regex OutputRegex =
|
||||
new(@"--\s*@output\s+([\w:]+)\s+""(.+?)""",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
public ScriptMetadata Parse(string filePath)
|
||||
{
|
||||
var text = File.ReadAllText(filePath);
|
||||
var lines = text.Split(Environment.NewLine);
|
||||
|
||||
string? description = null;
|
||||
var parameters = new List<ParameterDefinition>();
|
||||
var outputs = new List<OutputDefinition>();
|
||||
|
||||
foreach (var line in lines)
|
||||
{
|
||||
var descMatch = DescriptionRegex.Match(line);
|
||||
if (descMatch.Success)
|
||||
{
|
||||
description = descMatch.Groups[1].Value;
|
||||
continue;
|
||||
}
|
||||
|
||||
var paramMatch = ParamRegex.Match(line);
|
||||
if (paramMatch.Success)
|
||||
{
|
||||
var name = paramMatch.Groups[1].Value;
|
||||
var typeStr = paramMatch.Groups[2].Value;
|
||||
var displayName = paramMatch.Groups[3].Value;
|
||||
var defaultValue = paramMatch.Groups[4].Success ? paramMatch.Groups[4].Value : null;
|
||||
var tableQuery = paramMatch.Groups[5].Success ? paramMatch.Groups[5].Value : null;
|
||||
var dependsOn = paramMatch.Groups[6].Success ? paramMatch.Groups[6].Value : null;
|
||||
|
||||
var parameterType = typeStr.ToLower() switch
|
||||
{
|
||||
"int" => ParameterType.Int,
|
||||
"string" => ParameterType.String,
|
||||
"datetime" => ParameterType.DateTime,
|
||||
"bool" => ParameterType.Bool,
|
||||
"table" => ParameterType.Table,
|
||||
_ => ParameterType.String
|
||||
};
|
||||
|
||||
parameters.Add(new ParameterDefinition
|
||||
{
|
||||
Name = name,
|
||||
Type = parameterType,
|
||||
DisplayName = displayName,
|
||||
DefaultValue = defaultValue,
|
||||
TableQuery = tableQuery,
|
||||
DependsOn = dependsOn
|
||||
});
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
var outputMatch = OutputRegex.Match(line);
|
||||
if (outputMatch.Success)
|
||||
{
|
||||
var typeStr = outputMatch.Groups[1].Value;
|
||||
var title = outputMatch.Groups[2].Value;
|
||||
|
||||
var outputType = typeStr.ToLower() switch
|
||||
{
|
||||
"table" => OutputType.Table,
|
||||
"chart:line" => OutputType.ChartLine,
|
||||
"chart:bar" => OutputType.ChartBar,
|
||||
"chart:pie" => OutputType.ChartPie,
|
||||
_ => OutputType.Table
|
||||
};
|
||||
|
||||
outputs.Add(new OutputDefinition
|
||||
{
|
||||
Type = outputType,
|
||||
Title = title
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return new ScriptMetadata
|
||||
{
|
||||
FilePath = filePath,
|
||||
Name = Path.GetFileNameWithoutExtension(filePath),
|
||||
Description = description,
|
||||
Parameters = parameters,
|
||||
Outputs = outputs
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user