This commit is contained in:
Patrik Svensson 2021-04-05 23:06:33 +02:00
Родитель cbb19aa090
Коммит 98090fa1c9
23 изменённых файлов: 555 добавлений и 40 удалений

1
.github/funding.yml поставляемый Normal file
Просмотреть файл

@ -0,0 +1 @@
github: patriksvensson

49
.github/workflows/ci.yaml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,49 @@
name: Continuous Integration
on: pull_request
env:
# Set the DOTNET_SKIP_FIRST_TIME_EXPERIENCE environment variable to stop wasting time caching packages
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
# Disable sending usage data to Microsoft
DOTNET_CLI_TELEMETRY_OPTOUT: true
jobs:
###################################################
# BUILD
###################################################
build:
name: Build
if: "!contains(github.event.head_commit.message, 'skip-ci')"
strategy:
matrix:
kind: ['linux', 'windows', 'macOS']
include:
- kind: linux
os: ubuntu-latest
- kind: windows
os: windows-latest
- kind: macOS
os: macos-latest
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: 'Get Git tags'
run: git fetch --tags
shell: bash
- name: Setup dotnet
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.100
- name: Build
shell: bash
run: |
dotnet tool restore
dotnet cake

88
.github/workflows/publish.yaml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,88 @@
name: Publish
on:
push:
tags:
- '*'
branches:
- main
paths:
- 'src/**'
env:
# Set the DOTNET_SKIP_FIRST_TIME_EXPERIENCE environment variable to stop wasting time caching packages
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
# Disable sending usage data to Microsoft
DOTNET_CLI_TELEMETRY_OPTOUT: true
jobs:
###################################################
# BUILD
###################################################
build:
name: Build
if: "!contains(github.event.head_commit.message, 'skip-ci')"
strategy:
matrix:
kind: ['linux', 'windows', 'macOS']
include:
- kind: linux
os: ubuntu-latest
- kind: windows
os: windows-latest
- kind: macOS
os: macos-latest
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: 'Get Git tags'
run: git fetch --tags
shell: bash
- name: Setup dotnet
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.100
- name: Build
shell: bash
run: |
dotnet tool restore
dotnet cake
###################################################
# PUBLISH
###################################################
publish:
name: Publish
needs: [build]
if: "!contains(github.event.head_commit.message, 'skip-ci')"
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: 'Get Git tags'
run: git fetch --tags
shell: bash
- name: Setup dotnet
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.100
- name: Publish
shell: bash
run: |
dotnet tool restore
dotnet cake --target="publish" \
--nuget-key="${{secrets.NUGET_API_KEY}}"

79
build.cake Normal file
Просмотреть файл

@ -0,0 +1,79 @@
var target = Argument("target", "Default");
var configuration = Argument("configuration", "Release");
////////////////////////////////////////////////////////////////
// Tasks
Task("Build")
.Does(context =>
{
DotNetCoreBuild("./src/TermInfo.sln", new DotNetCoreBuildSettings {
Configuration = configuration,
NoIncremental = context.HasArgument("rebuild"),
MSBuildSettings = new DotNetCoreMSBuildSettings()
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
});
});
Task("Test")
.IsDependentOn("Build")
.Does(context =>
{
DotNetCoreTest("./src/TermInfo.sln", new DotNetCoreTestSettings {
Configuration = configuration,
NoRestore = true,
NoBuild = true,
});
});
Task("Package")
.IsDependentOn("Test")
.Does(context =>
{
context.CleanDirectory("./.artifacts");
context.DotNetCorePack($"./src/TermInfo.sln", new DotNetCorePackSettings {
Configuration = configuration,
NoRestore = true,
NoBuild = true,
OutputDirectory = "./.artifacts",
MSBuildSettings = new DotNetCoreMSBuildSettings()
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
});
});
Task("Publish-NuGet")
.WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions")
.IsDependentOn("Package")
.Does(context =>
{
var apiKey = Argument<string>("nuget-key", null);
if(string.IsNullOrWhiteSpace(apiKey)) {
throw new CakeException("No NuGet API key was provided.");
}
// Publish to GitHub Packages
foreach(var file in context.GetFiles("./.artifacts/*.nupkg"))
{
context.Information("Publishing {0}...", file.GetFilename().FullPath);
DotNetCoreNuGetPush(file.FullPath, new DotNetCoreNuGetPushSettings
{
Source = "https://api.nuget.org/v3/index.json",
ApiKey = apiKey,
});
}
});
////////////////////////////////////////////////////////////////
// Targets
Task("Publish")
.IsDependentOn("Publish-NuGet");
Task("Default")
.IsDependentOn("Package");
////////////////////////////////////////////////////////////////
// Execution
RunTarget(target)

95
src/.editorconfig Normal file
Просмотреть файл

@ -0,0 +1,95 @@
root = false
[*.cs]
# IDE0055: Fix formatting
dotnet_diagnostic.IDE0055.severity = warning
# SA1101: Prefix local calls with this
dotnet_diagnostic.SA1101.severity = none
# SA1633: File should have header
dotnet_diagnostic.SA1633.severity = none
# SA1201: Elements should appear in the correct order
dotnet_diagnostic.SA1201.severity = none
# SA1202: Public members should come before private members
dotnet_diagnostic.SA1202.severity = none
# SA1309: Field names should not begin with underscore
dotnet_diagnostic.SA1309.severity = none
# SA1404: Code analysis suppressions should have justification
dotnet_diagnostic.SA1404.severity = none
# SA1516: Elements should be separated by a blank line
dotnet_diagnostic.SA1516.severity = none
# CA1303: Do not pass literals as localized parameters
dotnet_diagnostic.CA1303.severity = none
# CSA1204: Static members should appear before non-static members
dotnet_diagnostic.SA1204.severity = none
# IDE0052: Remove unread private members
dotnet_diagnostic.IDE0052.severity = warning
# IDE0063: Use simple 'using' statement
csharp_prefer_simple_using_statement = false:suggestion
# IDE0018: Variable declaration can be inlined
dotnet_diagnostic.IDE0018.severity = warning
# SA1625: Element documenation should not be copied and pasted
dotnet_diagnostic.SA1625.severity = none
# IDE0005: Using directive is unnecessary
dotnet_diagnostic.IDE0005.severity = warning
# SA1117: Parameters should be on same line or separate lines
dotnet_diagnostic.SA1117.severity = none
# SA1404: Code analysis suppression should have justification
dotnet_diagnostic.SA1404.severity = none
# SA1101: Prefix local calls with this
dotnet_diagnostic.SA1101.severity = none
# SA1633: File should have header
dotnet_diagnostic.SA1633.severity = none
# SA1649: File name should match first type name
dotnet_diagnostic.SA1649.severity = none
# SA1402: File may only contain a single type
dotnet_diagnostic.SA1402.severity = none
# CA1814: Prefer jagged arrays over multidimensional
dotnet_diagnostic.CA1814.severity = none
# RCS1194: Implement exception constructors.
dotnet_diagnostic.RCS1194.severity = none
# CA1032: Implement standard exception constructors
dotnet_diagnostic.CA1032.severity = none
# CA1826: Do not use Enumerable methods on indexable collections. Instead use the collection directly
dotnet_diagnostic.CA1826.severity = none
# RCS1079: Throwing of new NotImplementedException.
dotnet_diagnostic.RCS1079.severity = warning
# RCS1057: Add empty line between declarations.
dotnet_diagnostic.RCS1057.severity = none
# IDE0004: Remove Unnecessary Cast
dotnet_diagnostic.IDE0004.severity = warning
# CA1810: Initialize reference type static fields inline
dotnet_diagnostic.CA1810.severity = none
# SA1636: File header copyright text should match
dotnet_diagnostic.SA1636.severity = none
# CA1724: Namespace conflict
dotnet_diagnostic.CA1724.severity = none

45
src/Directory.Build.props Normal file
Просмотреть файл

@ -0,0 +1,45 @@
<Project>
<PropertyGroup Label="Settings">
<Deterministic>true</Deterministic>
<LangVersion>9.0</LangVersion>
<DebugSymbols>true</DebugSymbols>
<DebugType>embedded</DebugType>
<MinVerSkip Condition="'$(Configuration)' == 'Debug'">true</MinVerSkip>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
<PropertyGroup Label="Deterministic Build" Condition="'$(GITHUB_ACTIONS)' == 'true'">
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
</PropertyGroup>
<PropertyGroup Label="Package Information">
<Description>A .NET library to read binary terminfo files.</Description>
<Authors>Patrik Svensson, Phil Scott</Authors>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/spectreconsole/wcwidth</RepositoryUrl>
<PackageProjectUrl>https://github.com/spectreconsole/wcwidth</PackageProjectUrl>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageReleaseNotes>https://github.com/spectreconsole/wcwidth/releases</PackageReleaseNotes>
</PropertyGroup>
<PropertyGroup Label="Source Link">
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
</PropertyGroup>
<ItemGroup Label="Package References">
<PackageReference Include="MinVer" PrivateAssets="All" Version="2.5.0" />
<PackageReference Include="Microsoft.SourceLink.GitHub" PrivateAssets="All" Version="1.0.0" />
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="5.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.333">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
<PackageReference Include="Roslynator.Analyzers" Version="3.1.0">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>

Просмотреть файл

@ -0,0 +1,8 @@
<Project>
<Target Name="Versioning" BeforeTargets="MinVer">
<PropertyGroup Label="Build">
<MinVerDefaultPreReleasePhase>preview</MinVerDefaultPreReleasePhase>
<MinVerVerbosity>normal</MinVerVerbosity>
</PropertyGroup>
</Target>
</Project>

Просмотреть файл

@ -0,0 +1,18 @@
root = false
[*.cs]
# CS1591: Missing XML comment for publicly visible type or member
dotnet_diagnostic.CS1591.severity = none
# SA1600: Elements should be documented
dotnet_diagnostic.SA1600.severity = none
# CA1305: Specify IFormatProvider
dotnet_diagnostic.CA1305.severity = none
# CA1055: URI-like return values should not be strings
dotnet_diagnostic.CA1055.severity = none
# Default severity for all analyzer diagnostics
dotnet_analyzer_diagnostic.severity = none

Просмотреть файл

@ -1,4 +1,3 @@
using System;
using Generator.Commands;
using Spectre.Console.Cli;

Просмотреть файл

@ -9,8 +9,14 @@
namespace TermInfo
{
/// <summary>
/// Represents known terminfo capabilities.
/// </summary>
public static class TermInfoCaps
{
/// <summary>
/// Represents known boolean terminfo capabilities.
/// </summary>
public enum Boolean
{
{{- for cap in capabilities.booleans }}
@ -21,6 +27,9 @@ namespace TermInfo
{{~ end ~}}
}
/// <summary>
/// Represents known numeric terminfo capabilities.
/// </summary>
public enum Num
{
{{- for cap in capabilities.nums }}
@ -31,6 +40,9 @@ namespace TermInfo
{{~ end ~}}
}
/// <summary>
/// Represents known string terminfo capabilities.
/// </summary>
public enum String
{
{{- for cap in capabilities.strings }}

Просмотреть файл

@ -3,6 +3,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
@ -22,4 +23,8 @@
</None>
</ItemGroup>
<ItemGroup>
<AdditionalFiles Include="..\stylecop.json" Link="Properties/stylecop.json" />
</ItemGroup>
</Project>

Просмотреть файл

@ -0,0 +1,14 @@
root = false
[*.cs]
# CS1591: Missing XML comment for publicly visible type or member
dotnet_diagnostic.CS1591.severity = none
# SA1600: Elements should be documented
dotnet_diagnostic.SA1600.severity = none
# SA1633: File should have header
dotnet_diagnostic.SA1633.severity = none
# CA1707: Identifiers should not contain underscores
dotnet_diagnostic.CA1707.severity = none

Просмотреть файл

@ -1,12 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Shouldly;
using TermInfo;
using Xunit;
namespace TermInfo.Tests

Просмотреть файл

@ -2,7 +2,6 @@
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
@ -14,6 +13,10 @@
<EmbeddedResource Include="Data\xterm+256color" />
</ItemGroup>
<ItemGroup>
<AdditionalFiles Include="..\stylecop.json" Link="Properties/stylecop.json" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
<PackageReference Include="Shouldly" Version="4.0.3" />

Просмотреть файл

@ -7,6 +7,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TermInfo", "TermInfo\TermIn
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TermInfo.Tests", "TermInfo.Tests\TermInfo.Tests.csproj", "{4D5E6C3E-C7AC-426C-AABE-9C44B1834C93}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TermInfo.Generator", "TermInfo.Generator\TermInfo.Generator.csproj", "{7F1EFE12-88C8-493F-8FC7-C40488179D89}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3D688222-B83C-4EDB-9ECD-C07CEC94FF2C}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
Directory.Build.props = Directory.Build.props
Directory.Build.targets = Directory.Build.targets
stylecop.json = stylecop.json
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -41,6 +51,18 @@ Global
{4D5E6C3E-C7AC-426C-AABE-9C44B1834C93}.Release|x64.Build.0 = Release|Any CPU
{4D5E6C3E-C7AC-426C-AABE-9C44B1834C93}.Release|x86.ActiveCfg = Release|Any CPU
{4D5E6C3E-C7AC-426C-AABE-9C44B1834C93}.Release|x86.Build.0 = Release|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Debug|x64.ActiveCfg = Debug|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Debug|x64.Build.0 = Debug|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Debug|x86.ActiveCfg = Debug|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Debug|x86.Build.0 = Debug|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Release|Any CPU.Build.0 = Release|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Release|x64.ActiveCfg = Release|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Release|x64.Build.0 = Release|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Release|x86.ActiveCfg = Release|Any CPU
{7F1EFE12-88C8-493F-8FC7-C40488179D89}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

Просмотреть файл

@ -4,9 +4,9 @@ using System.Text;
namespace TermInfo
{
public static class StreamExtensions
internal static class StreamExtensions
{
public static string ReadString(this Stream stream, int count)
public static string? ReadString(this Stream stream, int count)
{
var buffer = new byte[count];
var read = stream.Read(buffer, 0, count);

Просмотреть файл

@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TermInfo
{

Просмотреть файл

@ -38,6 +38,11 @@ namespace TermInfo
private static string[] ReadNames(Stream stream, TermInfoHeader header)
{
var names = stream.ReadString(header.NameSectionLength);
if (names == null)
{
throw new InvalidOperationException("Could not read terminfo name section.");
}
return names.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
}
@ -86,11 +91,16 @@ namespace TermInfo
return offsets;
}
private static string[] ReadStrings(Stream stream, TermInfoHeader header, int[] offsets)
private static string?[] ReadStrings(Stream stream, TermInfoHeader header, int[] offsets)
{
// Read strings
var strings = new string[offsets.Length];
var strings = new string?[offsets.Length];
var table = stream.ReadString(header.StringTableLength);
if (table == null)
{
throw new InvalidOperationException("Could not read terminfo string table");
}
for (var i = 0; i < offsets.Length; i++)
{
if (offsets[i] != -1)

Просмотреть файл

@ -3,21 +3,18 @@
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<PackageId>TermInfo</PackageId>
<Version>0.1</Version>
<Authors>Patrik Svensson</Authors>
<Authors>Patrik Svensson, Phil Scott</Authors>
<Nullable>enable</Nullable>
<Product>TermInfo</Product>
<Description>A library to read binary terminfo files.</Description>
<PackageLicenseFile>LICENSE.md</PackageLicenseFile>
<PackageProjectUrl>https://github.com/patriksvensson/terminfo</PackageProjectUrl>
<RepositoryUrl>https://github.com/patriksvensson/terminfo</RepositoryUrl>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageProjectUrl>https://github.com/spectreconsole/terminfo</PackageProjectUrl>
<RepositoryUrl>https://github.com/spectreconsole/terminfo</RepositoryUrl>
<RepositoryType>git</RepositoryType>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\LICENSE.md">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
<AdditionalFiles Include="..\stylecop.json" Link="Properties/stylecop.json" />
</ItemGroup>
</Project>

Просмотреть файл

@ -9,8 +9,14 @@
namespace TermInfo
{
/// <summary>
/// Represents known terminfo capabilities.
/// </summary>
public static class TermInfoCaps
{
/// <summary>
/// Represents known boolean terminfo capabilities.
/// </summary>
public enum Boolean
{
/// <summary>
@ -234,6 +240,9 @@ namespace TermInfo
ReturnDoesClrEol = 43,
}
/// <summary>
/// Represents known numeric terminfo capabilities.
/// </summary>
public enum Num
{
/// <summary>
@ -432,6 +441,9 @@ namespace TermInfo
NumberOfFunctionKeys = 38,
}
/// <summary>
/// Represents known string terminfo capabilities.
/// </summary>
public enum String
{
/// <summary>

Просмотреть файл

@ -1,22 +1,25 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TermInfo
{
/// <summary>
/// Represents a parsed terminfo description.
/// </summary>
public sealed partial class TermInfoData
{
private readonly string[] _names;
private readonly bool[] _booleans;
private readonly int[] _nums;
private readonly string[] _strings;
private readonly string?[] _strings;
/// <summary>
/// Gets the names of the parsed terminfo description.
/// </summary>
public string[] Names => _names;
internal TermInfoData(string[] names, bool[] booleans, int[] nums, string[] strings)
internal TermInfoData(string[] names, bool[] booleans, int[] nums, string?[] strings)
{
_names = names;
_booleans = booleans;
@ -24,6 +27,11 @@ namespace TermInfo
_strings = strings;
}
/// <summary>
/// Reads terminfo description from a stream.
/// </summary>
/// <param name="stream">The stream to read from.</param>
/// <returns>The parsed terminfo description.</returns>
public static TermInfoData Read(Stream stream)
{
if (stream is null)
@ -34,6 +42,11 @@ namespace TermInfo
return Parser.Parse(stream);
}
/// <summary>
/// Gets a specific boolean terminfo capability value.
/// </summary>
/// <param name="value">The capability to get the value for.</param>
/// <returns>The terminfo capability value.</returns>
public bool? GetBoolean(TermInfoCaps.Boolean value)
{
if (TryGetBoolean(value, out var result))
@ -44,7 +57,11 @@ namespace TermInfo
return null;
}
/// <summary>
/// Gets a specific numeric terminfo capability value.
/// </summary>
/// <param name="value">The capability to get the value for.</param>
/// <returns>The terminfo capability value.</returns>
public int? GetNum(TermInfoCaps.Num value)
{
if (TryGetNum(value, out var result))
@ -55,7 +72,12 @@ namespace TermInfo
return null;
}
public string GetString(TermInfoCaps.String value)
/// <summary>
/// Gets a specific string terminfo capability value.
/// </summary>
/// <param name="value">The capability to get the value for.</param>
/// <returns>The terminfo capability value.</returns>
public string? GetString(TermInfoCaps.String value)
{
if (TryGetString(value, out var result))
{
@ -65,7 +87,13 @@ namespace TermInfo
return null;
}
public bool TryGetBoolean(TermInfoCaps.Boolean value, out bool? result)
/// <summary>
/// Tries to get a specific boolean terminfo capability value.
/// </summary>
/// <param name="value">The capability to get the value for.</param>
/// <param name="result">The terminfo capability value, or <c>null</c> if missing.</param>
/// <returns><c>true</c> if the capability was found, otherwise <c>false</c>.</returns>
public bool TryGetBoolean(TermInfoCaps.Boolean value, [NotNullWhen(true)] out bool? result)
{
var index = (int)value;
if (index >= _booleans.Length)
@ -78,7 +106,13 @@ namespace TermInfo
return true;
}
public bool TryGetNum(TermInfoCaps.Num value, out int? result)
/// <summary>
/// Tries to get a specific numeric terminfo capability value.
/// </summary>
/// <param name="value">The capability to get the value for.</param>
/// <param name="result">The terminfo capability value, or <c>null</c> if missing.</param>
/// <returns><c>true</c> if the capability was found, otherwise <c>false</c>.</returns>
public bool TryGetNum(TermInfoCaps.Num value, [NotNullWhen(true)] out int? result)
{
var index = (int)value;
if (index >= _nums.Length)
@ -97,7 +131,13 @@ namespace TermInfo
return true;
}
public bool TryGetString(TermInfoCaps.String value, out string result)
/// <summary>
/// Tries to get a specific string terminfo capability value.
/// </summary>
/// <param name="value">The capability to get the value for.</param>
/// <param name="result">The terminfo capability value, or <c>null</c> if missing.</param>
/// <returns><c>true</c> if the capability was found, otherwise <c>false</c>.</returns>
public bool TryGetString(TermInfoCaps.String value, [NotNullWhen(true)] out string? result)
{
var index = (int)value;
if (index >= _strings.Length)

Просмотреть файл

@ -1,4 +1,4 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.IO;
namespace TermInfo
@ -11,7 +11,7 @@ namespace TermInfo
public int StringOffsetCount { get; set; }
public int StringTableLength { get; set; }
public static bool TryRead(Stream stream, out TermInfoHeader header)
public static bool TryRead(Stream stream, [NotNullWhen(true)] out TermInfoHeader? header)
{
var magic = stream.ReadShort();
if (magic != 282)

27
src/stylecop.json Normal file
Просмотреть файл

@ -0,0 +1,27 @@
{
"$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
"settings": {
"documentationRules": {
"xmlHeader": false,
"documentExposedElements": true,
"documentInternalElements": false,
"documentPrivateElements": false,
"documentPrivateFields": false
},
"layoutRules": {
"newlineAtEndOfFile": "allow",
"allowConsecutiveUsings": true
},
"orderingRules": {
"usingDirectivesPlacement": "outsideNamespace",
"systemUsingDirectivesFirst": true,
"elementOrder": [
"kind",
"accessibility",
"constant",
"static",
"readonly"
]
}
}
}