Добавьте файлы проекта.

This commit is contained in:
2025-11-27 09:10:58 +03:00
parent 730fd30d87
commit c1f50fcca0
32 changed files with 1154 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<PackageId>ArgumentsToolkit.Help</PackageId>
<Version>1.0.0</Version>
<Authors>FrigaT</Authors>
<Company>FrigaT</Company>
<Description>Расширение для ArgumentsToolkit.Core: генерация справки (--help), вывод в консоль, Markdown/HTML.</Description>
<PackageTags>cli arguments parser help toolkit</PackageTags>
<RepositoryUrl>https://git.frigat.duckdns.org/FrigaT/ArgumentsToolkit</RepositoryUrl>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\ArgumentsToolkit.Core\ArgumentsToolkit.Core.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,36 @@
using System.Reflection;
namespace ArgumentsToolkit.Help;
/// <summary>
/// Сборщик информации о параметрах из модели Options.
/// </summary>
public static class HelpCollector
{
/// <summary>
/// Собирает метаданные о параметрах из указанной модели Options.
/// </summary>
public static HelpModel Collect<T>()
{
var model = new HelpModel();
var props = typeof(T).GetProperties();
foreach (var prop in props)
{
var opt = prop.GetCustomAttribute<OptionAttribute>();
if (opt == null) continue;
model.Entries.Add(new HelpEntry
{
Name = opt.Name,
ShortName = opt.ShortName,
Description = opt.Description,
TypeName = prop.PropertyType.Name,
Required = opt.Required,
DefaultValue = opt.DefaultValue
});
}
return model;
}
}

View File

@@ -0,0 +1,13 @@
namespace ArgumentsToolkit.Help;
/// <summary>
/// Исключение, выбрасываемое при ошибках генерации справки.
/// </summary>
public class HelpGenerationException : Exception
{
/// <summary>
/// Создаёт новое исключение генерации справки.
/// </summary>
/// <param name="message">Сообщение об ошибке.</param>
public HelpGenerationException(string message) : base(message) { }
}

View File

@@ -0,0 +1,29 @@
namespace ArgumentsToolkit.Help;
/// <summary>
/// Расширенные методы для удобного форматирования справки.
/// </summary>
public static class HelpExtensions
{
/// <summary>
/// Форматирует справку в Markdown.
/// </summary>
/// <param name="model">Модель справки.</param>
/// <returns>Строка в формате Markdown.</returns>
public static string AsMarkdown(this HelpModel model)
{
IHelpFormatter formatter = new MarkdownHelpFormatter();
return formatter.Format(model);
}
/// <summary>
/// Форматирует справку в HTML.
/// </summary>
/// <param name="model">Модель справки.</param>
/// <returns>Строка в формате HTML.</returns>
public static string AsHtml(this HelpModel model)
{
IHelpFormatter formatter = new HtmlHelpFormatter();
return formatter.Format(model);
}
}

View File

@@ -0,0 +1,21 @@
namespace ArgumentsToolkit.Help;
/// <summary>
/// Форматтер для генерации справки в формате HTML.
/// </summary>
public class HtmlHelpFormatter : IHelpFormatter
{
public string Format(HelpModel model)
{
var lines = new List<string> { $"<h2>{model.Title}</h2>", "<ul>" };
foreach (var entry in model.Entries)
{
string required = entry.Required ? " (обязательный)" : "";
lines.Add($"<li><b>--{entry.Name} / -{entry.ShortName}</b>: {entry.Description} ({entry.TypeName}{required})</li>");
}
lines.Add("</ul>");
return string.Join(Environment.NewLine, lines);
}
}

View File

@@ -0,0 +1,9 @@
namespace ArgumentsToolkit.Help;
/// <summary>
/// Интерфейс для форматирования справки в разные форматы.
/// </summary>
public interface IHelpFormatter
{
string Format(HelpModel model);
}

View File

@@ -0,0 +1,20 @@
namespace ArgumentsToolkit.Help;
/// <summary>
/// Форматтер для генерации справки в формате Markdown.
/// </summary>
public class MarkdownHelpFormatter : IHelpFormatter
{
public string Format(HelpModel model)
{
var lines = new List<string> { $"## {model.Title}" };
foreach (var entry in model.Entries)
{
string required = entry.Required ? " (обязательный)" : "";
lines.Add($"- **--{entry.Name} / -{entry.ShortName}**: {entry.Description} ({entry.TypeName}{required})");
}
return string.Join(Environment.NewLine, lines);
}
}

View File

@@ -0,0 +1,14 @@
namespace ArgumentsToolkit.Help;
/// <summary>
/// Описание одного аргумента для справки.
/// </summary>
public class HelpEntry
{
public string Name { get; set; }
public string? ShortName { get; set; }
public string? Description { get; set; }
public string TypeName { get; set; }
public bool Required { get; set; }
public object? DefaultValue { get; set; }
}

View File

@@ -0,0 +1,10 @@
namespace ArgumentsToolkit.Help;
/// <summary>
/// Справка по всей модели Options.
/// </summary>
public class HelpModel
{
public string Title { get; set; } = "Доступные аргументы";
public List<HelpEntry> Entries { get; set; } = new();
}