mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-02-15 03:30:53 +01:00
Add ProtoId parser to Toolshed (#5220)
* Add ProtoId parser to Toolshed * Change obsolete FromMarkup to FromMarkupOrThrow
This commit is contained in:
59
Robust.Shared/Toolshed/TypeParsers/ProtoIdTypeParser.cs
Normal file
59
Robust.Shared/Toolshed/TypeParsers/ProtoIdTypeParser.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using System.Diagnostics;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Threading.Tasks;
|
||||
using Robust.Shared.Console;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Maths;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Toolshed.Errors;
|
||||
using Robust.Shared.Toolshed.Syntax;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
namespace Robust.Shared.Toolshed.TypeParsers;
|
||||
|
||||
internal sealed class ProtoIdTypeParser<T> : TypeParser<ProtoId<T>>
|
||||
where T : class, IPrototype
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||
|
||||
public override bool TryParse(ParserContext parserContext, [NotNullWhen(true)] out object? result, out IConError? error)
|
||||
{
|
||||
var proto = parserContext.GetWord(ParserContext.IsToken);
|
||||
|
||||
if (proto is null || !_prototype.HasMapping<T>(proto))
|
||||
{
|
||||
_prototype.TryGetKindFrom<T>(out var kind);
|
||||
DebugTools.AssertNotNull(kind);
|
||||
|
||||
error = new NotAValidProtoId(proto ?? "[null]", kind!);
|
||||
result = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
result = new ProtoId<T>(proto);
|
||||
error = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
public override ValueTask<(CompletionResult? result, IConError? error)> TryAutocomplete(ParserContext parserContext, string? argName)
|
||||
{
|
||||
var options = CompletionHelper.PrototypeIDs<T>();
|
||||
|
||||
_prototype.TryGetKindFrom<T>(out var kind);
|
||||
DebugTools.AssertNotNull(kind);
|
||||
|
||||
return ValueTask.FromResult<(CompletionResult? result, IConError? error)>((CompletionResult.FromHintOptions(options, $"<{kind} protoId>"), null));
|
||||
}
|
||||
}
|
||||
|
||||
public record NotAValidProtoId(string Proto, string Kind) : IConError
|
||||
{
|
||||
public FormattedMessage DescribeInner()
|
||||
{
|
||||
return FormattedMessage.FromMarkupOrThrow($"{Proto} is not a valid {Kind} prototype");
|
||||
}
|
||||
|
||||
public string? Expression { get; set; }
|
||||
public Vector2i? IssueSpan { get; set; }
|
||||
public StackTrace? Trace { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user