Files
RobustToolbox/Robust.Shared/Toolshed/LocalVarInvocationContext.cs
Leon Friedrich 9af119f57a Toolshed Rejig (#5455)
* Toolshed Rejig

* shorten hint string

* Try fix conflicts. Ill make with work later

* bodge

* Fix ProtoIdTypeParser assert

* comment

* AllEntities

* Remove more linq from WhereCommand

* better help strings

* Add ContainsCommand

* loc strings

* Add contains command description

* Add $self variable

* Errors for writing to readonly variables

* A
2024-12-21 17:49:11 +11:00

99 lines
2.6 KiB
C#

using System.Collections.Generic;
using Robust.Shared.Network;
using Robust.Shared.Player;
using Robust.Shared.Toolshed.Errors;
namespace Robust.Shared.Toolshed;
/// <summary>
/// <see cref="IInvocationContext"/> that wraps some other context and provides some local variables.
/// </summary>
public sealed class LocalVarInvocationContext(IInvocationContext inner) : IInvocationContext
{
public bool CheckInvokable(CommandSpec command, out IConError? error)
{
return inner.CheckInvokable(command, out error);
}
public ICommonSession? Session => inner.Session;
public ToolshedManager Toolshed => inner.Toolshed;
public NetUserId? User => inner.User;
public ToolshedEnvironment Environment => inner.Environment;
public void WriteLine(string line) => inner.WriteLine(line);
public void ReportError(IConError err) => inner.ReportError(err);
public IEnumerable<IConError> GetErrors() => inner.GetErrors();
public bool HasErrors => inner.HasErrors;
public void ClearErrors() => inner.ClearErrors();
public Dictionary<string, object?> LocalVars = new();
public HashSet<string>? ReadonlyVars;
public void SetLocal(string name, object? value)
{
LocalVars[name] = value;
}
public void SetLocal(string name, object? value, bool @readonly)
{
LocalVars[name] = value;
SetReadonly(name, @readonly);
}
public void SetReadonly(string name, bool @readonly)
{
if (@readonly)
{
ReadonlyVars ??= new();
ReadonlyVars.Add(name);
}
else
{
ReadonlyVars?.Remove(name);
}
}
public void ClearLocal(string name)
{
LocalVars.Remove(name);
ReadonlyVars?.Remove(name);
}
public object? ReadVar(string name)
{
return LocalVars.TryGetValue(name, out var obj)
? obj
: inner.ReadVar(name);
}
public void WriteVar(string name, object? value)
{
if (ReadonlyVars != null && ReadonlyVars.Contains(name))
{
ReportError(new ReadonlyVariableError(name));
return;
}
if (LocalVars.ContainsKey(name))
LocalVars[name] = value;
else
inner.WriteVar(name, value);
}
public bool IsReadonlyVar(string name) => ReadonlyVars != null && ReadonlyVars.Contains(name);
public IEnumerable<string> GetVars()
{
foreach (var key in LocalVars.Keys)
{
yield return key;
}
foreach (var key in inner.GetVars())
{
if (!LocalVars.ContainsKey(key))
yield return key;
}
}
}