Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Serde" Version="0.8.0-preview4" />
<PackageVersion Include="Serde" Version="[0.8.0-preview5]" />
<PackageVersion Include="Spectre.Console" Version="0.49.1" />
<PackageVersion Include="Spectre.Console.Testing" Version="0.46.0" />
<PackageVersion Include="StaticCs" Version="0.3.1" />
Expand Down
6 changes: 3 additions & 3 deletions src/Serde.CmdLine/CmdLine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public static Result<T, IReadOnlyList<ISerdeInfo>> ParseRaw<T>(
var deserializer = new Deserializer(args, handleHelp);
try
{
var cmd = T.DeserializeInstance.Deserialize(deserializer);
var cmd = T.Instance.Deserialize(deserializer);
if (handleHelp && deserializer.HelpInfos.Count > 0)
{
return new Result<T, IReadOnlyList<ISerdeInfo>>.Err(deserializer.HelpInfos);
Expand Down Expand Up @@ -59,7 +59,7 @@ public static bool TryParse<T>(string[] args, IAnsiConsole console, out T cmd)
cmd = value;
return true;
case Result<T, IReadOnlyList<ISerdeInfo>>.Err(var helpInfos):
var rootInfo = SerdeInfoProvider.GetInfo<T>();
var rootInfo = SerdeInfoProvider.GetDeserializeInfo<T>();
var lastInfo = helpInfos.Last();
console.WriteLine(CmdLine.GetHelpText(rootInfo, lastInfo, includeHelp: true));
cmd = default!;
Expand All @@ -71,7 +71,7 @@ public static bool TryParse<T>(string[] args, IAnsiConsole console, out T cmd)
catch (ArgumentSyntaxException ex)
{
console.WriteLine("error: " + ex.Message);
var rootInfo = SerdeInfoProvider.GetInfo<T>();
var rootInfo = SerdeInfoProvider.GetDeserializeInfo<T>();
console.WriteLine(GetHelpText(rootInfo));
cmd = default!;
return false;
Expand Down
36 changes: 19 additions & 17 deletions src/Serde.CmdLine/Deserializer.DeserializeType.cs
Original file line number Diff line number Diff line change
@@ -1,36 +1,38 @@
namespace Serde.CmdLine;

internal sealed partial class Deserializer : IDeserializeType
internal sealed partial class Deserializer : ITypeDeserializer
{
V IDeserializeType.ReadValue<V, D>(int index, D deserialize) => deserialize.Deserialize(this);
int? ITypeDeserializer.SizeOpt => null;

bool IDeserializeType.ReadBool(int index) => ReadBool();
T ITypeDeserializer.ReadValue<T>(ISerdeInfo info, int index, IDeserialize<T> deserialize) => deserialize.Deserialize(this);

byte IDeserializeType.ReadByte(int index) => ReadByte();
bool ITypeDeserializer.ReadBool(ISerdeInfo info, int index) => ReadBool();

char IDeserializeType.ReadChar(int index) => ReadChar();
byte ITypeDeserializer.ReadU8(ISerdeInfo info, int index) => ReadU8();

decimal IDeserializeType.ReadDecimal(int index) => ReadDecimal();
char ITypeDeserializer.ReadChar(ISerdeInfo info, int index) => ReadChar();

double IDeserializeType.ReadDouble(int index) => ReadDouble();
decimal ITypeDeserializer.ReadDecimal(ISerdeInfo info, int index) => ReadDecimal();

float IDeserializeType.ReadFloat(int index) => ReadFloat();
double ITypeDeserializer.ReadF64(ISerdeInfo info, int index) => ReadF64();

short IDeserializeType.ReadI16(int index) => ReadI16();
float ITypeDeserializer.ReadF32(ISerdeInfo info, int index) => ReadF32();

int IDeserializeType.ReadI32(int index) => ReadI32();
short ITypeDeserializer.ReadI16(ISerdeInfo info, int index) => ReadI16();

long IDeserializeType.ReadI64(int index) => ReadI64();
int ITypeDeserializer.ReadI32(ISerdeInfo info, int index) => ReadI32();

sbyte IDeserializeType.ReadSByte(int index) => ReadSByte();
long ITypeDeserializer.ReadI64(ISerdeInfo info, int index) => ReadI64();

string IDeserializeType.ReadString(int index) => ReadString();
sbyte ITypeDeserializer.ReadI8(ISerdeInfo info, int index) => ReadI8();

ushort IDeserializeType.ReadU16(int index) => ReadU16();
string ITypeDeserializer.ReadString(ISerdeInfo info, int index) => ReadString();

uint IDeserializeType.ReadU32(int index) => ReadU32();
ushort ITypeDeserializer.ReadU16(ISerdeInfo info, int index) => ReadU16();

ulong IDeserializeType.ReadU64(int index) => ReadU64();
uint ITypeDeserializer.ReadU32(ISerdeInfo info, int index) => ReadU32();

void IDeserializeType.SkipValue() => _argIndex++;
ulong ITypeDeserializer.ReadU64(ISerdeInfo info, int index) => ReadU64();

void ITypeDeserializer.SkipValue(ISerdeInfo info, int index) => _argIndex++;
}
28 changes: 10 additions & 18 deletions src/Serde.CmdLine/Deserializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ internal sealed partial class Deserializer(string[] args, bool handleHelp) : IDe

public IReadOnlyList<ISerdeInfo> HelpInfos => _helpInfos;

int IDeserializeType.TryReadIndex(ISerdeInfo serdeInfo, out string? errorName)
int ITypeDeserializer.TryReadIndex(ISerdeInfo serdeInfo, out string? errorName)
{
if (_argIndex == args.Length)
{
errorName = null;
return IDeserializeType.EndOfType;
return ITypeDeserializer.EndOfType;
}

var arg = args[_argIndex];
Expand All @@ -29,7 +29,7 @@ int IDeserializeType.TryReadIndex(ISerdeInfo serdeInfo, out string? errorName)
if (_argIndex == args.Length)
{
errorName = null;
return IDeserializeType.EndOfType;
return ITypeDeserializer.EndOfType;
}
arg = args[_argIndex];
}
Expand Down Expand Up @@ -113,7 +113,7 @@ int IDeserializeType.TryReadIndex(ISerdeInfo serdeInfo, out string? errorName)
else
{
errorName = arg;
return IDeserializeType.IndexNotFound;
return ITypeDeserializer.IndexNotFound;
}
}

Expand All @@ -132,47 +132,39 @@ public bool ReadBool()

public string ReadString() => args[_argIndex++];

public T ReadNullableRef<T, D>(D d)
public T ReadNullableRef<T>(IDeserialize<T> d)
where T : class
where D : IDeserialize<T>
{
// Treat all nullable values as just being optional. Since we got here we must have a value
// in hand.
return d.Deserialize(this);
}

public T ReadAny<T>(IDeserializeVisitor<T> v) where T : class => throw new NotImplementedException();

public char ReadChar() => throw new NotImplementedException();

public byte ReadByte() => throw new NotImplementedException();
public byte ReadU8() => throw new NotImplementedException();

public ushort ReadU16() => throw new NotImplementedException();

public uint ReadU32() => throw new NotImplementedException();

public ulong ReadU64() => throw new NotImplementedException();

public sbyte ReadSByte() => throw new NotImplementedException();
public sbyte ReadI8() => throw new NotImplementedException();

public short ReadI16() => throw new NotImplementedException();

public int ReadI32() => throw new NotImplementedException();

public long ReadI64() => throw new NotImplementedException();

public float ReadFloat() => throw new NotImplementedException();
public float ReadF32() => throw new NotImplementedException();

public double ReadDouble() => throw new NotImplementedException();
public double ReadF64() => throw new NotImplementedException();

public decimal ReadDecimal() => throw new NotImplementedException();

public IDeserializeCollection ReadCollection(ISerdeInfo typeInfo)
{
throw new NotImplementedException();
}

public IDeserializeType ReadType(ISerdeInfo typeInfo) => this;
public ITypeDeserializer ReadType(ISerdeInfo typeInfo) => this;

public void Dispose() { }
}
18 changes: 14 additions & 4 deletions src/dnvm/Channel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,16 +61,20 @@ partial record Channel : ISerializeProvider<Channel>
public sealed override string ToString() => GetDisplayName();
public string GetLowerName() => GetDisplayName().ToLowerInvariant();

static ISerdeInfo ISerdeInfoProvider.SerdeInfo { get; } = SerdeInfo.MakePrimitive(nameof(Channel));
static ISerialize<Channel> ISerializeProvider<Channel>.SerializeInstance => Serialize.Instance;
static ISerialize<Channel> ISerializeProvider<Channel>.Instance => Serialize.Instance;

private sealed class Serialize : ISerialize<Channel>
{
public static readonly Serialize Instance = new();
private Serialize() { }

/// <summary>
/// Serialize as a string.
/// </summary>
ISerdeInfo ISerdeInfoProvider.SerdeInfo => StringProxy.SerdeInfo;

void ISerialize<Channel>.Serialize(Channel channel, ISerializer serializer)
=> serializer.SerializeString(channel.GetLowerName());
=> serializer.WriteString(channel.GetLowerName());
}

partial record VersionedMajorMinor
Expand Down Expand Up @@ -101,7 +105,7 @@ partial record Preview : Channel

partial record Channel : IDeserializeProvider<Channel>
{
static IDeserialize<Channel> IDeserializeProvider<Channel>.DeserializeInstance => DeserializeProxy.Instance;
static IDeserialize<Channel> IDeserializeProvider<Channel>.Instance => DeserializeProxy.Instance;

public static Channel FromString(string str)
{
Expand Down Expand Up @@ -137,6 +141,12 @@ public static Channel FromString(string str)
private sealed class DeserializeProxy : IDeserialize<Channel>
{
public static readonly DeserializeProxy Instance = new();

/// <summary>
/// Deserialize as a string.
/// </summary>
ISerdeInfo ISerdeInfoProvider.SerdeInfo => StringProxy.SerdeInfo;

public Channel Deserialize(IDeserializer deserializer)
=> FromString(StringProxy.Instance.Deserialize(deserializer));
}
Expand Down
14 changes: 7 additions & 7 deletions src/dnvm/CommandLineArguments.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public sealed partial record InstallCommand : DnvmSubCommand
public bool? Force { get; init; } = null;

[CommandOption("-s|--sdk-dir", Description = "Install the SDK into a separate directory with the given name.")]
[SerdeMemberOptions(DeserializeProxy = typeof(NullableRefProxy.Deserialize<SdkDirName, SdkDirNameProxy>))] // Treat as string
[SerdeMemberOptions(DeserializeProxy = typeof(NullableRefProxy.De<SdkDirName, SdkDirNameProxy>))] // Treat as string
public SdkDirName? SdkDir { get; init; } = null;

[CommandOption("-v|--verbose", Description = "Print debugging messages to the console.")]
Expand Down Expand Up @@ -159,7 +159,7 @@ public sealed partial record UninstallCommand : DnvmSubCommand
public required SemVersion SdkVersion { get; init; }

[CommandOption("-s|--sdk-dir", Description = "Uninstall the SDK from the given directory.")]
[SerdeMemberOptions(DeserializeProxy = typeof(NullableRefProxy.Deserialize<SdkDirName, SdkDirNameProxy>))] // Treat as string
[SerdeMemberOptions(DeserializeProxy = typeof(NullableRefProxy.De<SdkDirName, SdkDirNameProxy>))] // Treat as string
public SdkDirName? SdkDir { get; init; } = null;
}

Expand All @@ -185,8 +185,8 @@ public sealed partial record RestoreCommand : DnvmSubCommand
/// </summary>
private sealed class CaseInsensitiveChannel : IDeserializeProvider<Channel>, IDeserialize<Channel>
{
public static ISerdeInfo SerdeInfo => Serde.SerdeInfo.MakePrimitive(nameof(Channel));
static IDeserialize<Channel> IDeserializeProvider<Channel>.DeserializeInstance { get; } = new CaseInsensitiveChannel();
public ISerdeInfo SerdeInfo => StringProxy.SerdeInfo;
static IDeserialize<Channel> IDeserializeProvider<Channel>.Instance { get; } = new CaseInsensitiveChannel();
private CaseInsensitiveChannel() { }

public Channel Deserialize(IDeserializer deserializer)
Expand Down Expand Up @@ -326,7 +326,7 @@ public sealed record class CommandLineArguments(CommandArguments? Command)
catch (ArgumentSyntaxException ex)
{
console.WriteLine("error: " + ex.Message);
console.WriteLine(CmdLine.GetHelpText(SerdeInfoProvider.GetInfo<DnvmCommand>(), includeHelp: true));
console.WriteLine(CmdLine.GetHelpText(SerdeInfoProvider.GetDeserializeInfo<DnvmCommand>(), includeHelp: true));
return null;
}
}
Expand All @@ -344,7 +344,7 @@ public static CommandLineArguments ParseRaw(IAnsiConsole console, string[] args)
dnvmCmd = value;
break;
case Result<DnvmCommand, IReadOnlyList<ISerdeInfo>>.Err(var helpInfos):
var rootInfo = SerdeInfoProvider.GetInfo<DnvmCommand>();
var rootInfo = SerdeInfoProvider.GetDeserializeInfo<DnvmCommand>();
var lastInfo = helpInfos.Last();
console.WriteLine(CmdLine.GetHelpText(rootInfo, lastInfo, includeHelp: true));
return new CommandLineArguments(Command: null);
Expand Down Expand Up @@ -438,7 +438,7 @@ public static CommandLineArguments ParseRaw(IAnsiConsole console, string[] args)
}
case null:
{
console.WriteLine(CmdLine.GetHelpText(SerdeInfoProvider.GetInfo<DnvmCommand>(), includeHelp: true));
console.WriteLine(CmdLine.GetHelpText(SerdeInfoProvider.GetDeserializeInfo<DnvmCommand>(), includeHelp: true));
return new CommandLineArguments(Command: null);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/dnvm/ManifestSchema/Manifest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ public partial record RegisteredChannel
public required Channel ChannelName { get; init; }
public required SdkDirName SdkDirName { get; init; }
[SerdeMemberOptions(
SerializeProxy = typeof(EqArrayProxy.Serialize<SemVersion, SemVersionProxy>),
DeserializeProxy = typeof(EqArrayProxy.Deserialize<SemVersion, SemVersionProxy>))]
SerializeProxy = typeof(EqArrayProxy.Ser<SemVersion, SemVersionProxy>),
DeserializeProxy = typeof(EqArrayProxy.De<SemVersion, SemVersionProxy>))]
public EqArray<SemVersion> InstalledSdkVersions { get; init; } = EqArray<SemVersion>.Empty;
public bool Untracked { get; init; } = false;
}
Expand Down
4 changes: 2 additions & 2 deletions src/dnvm/ManifestSchema/ManifestV5.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ public partial record TrackedChannelV5
public required Channel ChannelName { get; init; }
public required SdkDirName SdkDirName { get; init; }
[SerdeMemberOptions(
SerializeProxy = typeof(EqArrayProxy.Serialize<SemVersion, SemVersionProxy>),
DeserializeProxy = typeof(EqArrayProxy.Deserialize<SemVersion, SemVersionProxy>))]
SerializeProxy = typeof(EqArrayProxy.Ser<SemVersion, SemVersionProxy>),
DeserializeProxy = typeof(EqArrayProxy.De<SemVersion, SemVersionProxy>))]
public EqArray<SemVersion> InstalledSdkVersions { get; init; } = EqArray<SemVersion>.Empty;
}

Expand Down
4 changes: 2 additions & 2 deletions src/dnvm/ManifestSchema/ManifestV6.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ public partial record TrackedChannelV6
public required Channel ChannelName { get; init; }
public required SdkDirName SdkDirName { get; init; }
[SerdeMemberOptions(
SerializeProxy = typeof(EqArrayProxy.Serialize<SemVersion, SemVersionProxy>),
DeserializeProxy = typeof(EqArrayProxy.Deserialize<SemVersion, SemVersionProxy>))]
SerializeProxy = typeof(EqArrayProxy.Ser<SemVersion, SemVersionProxy>),
DeserializeProxy = typeof(EqArrayProxy.De<SemVersion, SemVersionProxy>))]
public EqArray<SemVersion> InstalledSdkVersions { get; init; } = EqArray<SemVersion>.Empty;
public bool Untracked { get; init; } = false;
}
Expand Down
4 changes: 2 additions & 2 deletions src/dnvm/ManifestSchema/ManifestV7.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ public partial record RegisteredChannelV7
public required Channel ChannelName { get; init; }
public required SdkDirName SdkDirName { get; init; }
[SerdeMemberOptions(
SerializeProxy = typeof(EqArrayProxy.Serialize<SemVersion, SemVersionProxy>),
DeserializeProxy = typeof(EqArrayProxy.Deserialize<SemVersion, SemVersionProxy>))]
SerializeProxy = typeof(EqArrayProxy.Ser<SemVersion, SemVersionProxy>),
DeserializeProxy = typeof(EqArrayProxy.De<SemVersion, SemVersionProxy>))]
public EqArray<SemVersion> InstalledSdkVersions { get; init; } = EqArray<SemVersion>.Empty;
public bool Untracked { get; init; } = false;
}
Expand Down
2 changes: 1 addition & 1 deletion src/dnvm/RestoreCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ internal sealed partial record GlobalJsonSubset
[GenerateDeserialize]
public sealed partial record SdkSubset
{
[SerdeMemberOptions(DeserializeProxy = typeof(NullableRefProxy.Deserialize<SemVersion, SemVersionProxy>))]
[SerdeMemberOptions(DeserializeProxy = typeof(NullableRefProxy.De<SemVersion, SemVersionProxy>))]
public SemVersion? Version { get; init; }
public RollForwardOptions? RollForward { get; init; }
public bool? AllowPrerelease { get; init; }
Expand Down
17 changes: 6 additions & 11 deletions src/dnvm/ScalarDeserializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public sealed class ScalarDeserializer(string s) : IDeserializer
public bool ReadBool()
=> bool.Parse(s);

public byte ReadByte()
public byte ReadU8()
=> byte.Parse(s);

public char ReadChar()
Expand All @@ -18,17 +18,17 @@ public char ReadChar()
public decimal ReadDecimal()
=> decimal.Parse(s);

public double ReadDouble() => double.Parse(s);
public double ReadF64() => double.Parse(s);

public float ReadFloat() => float.Parse(s);
public float ReadF32() => float.Parse(s);

public short ReadI16() => short.Parse(s);

public int ReadI32() => int.Parse(s);

public long ReadI64() => long.Parse(s);

public sbyte ReadSByte() => sbyte.Parse(s);
public sbyte ReadI8() => sbyte.Parse(s);

public string ReadString() => s;

Expand All @@ -40,16 +40,11 @@ public decimal ReadDecimal()

void IDisposable.Dispose() { }

T IDeserializer.ReadAny<T>(IDeserializeVisitor<T> v) => v.VisitString(ReadString());

IDeserializeCollection IDeserializer.ReadCollection(ISerdeInfo typeInfo)
=> throw new DeserializeException("Found nullable ref, expected scalar");

T IDeserializer.ReadNullableRef<T, D>(D deserialize)
T IDeserializer.ReadNullableRef<T>(IDeserialize<T> deserialize)
{
return deserialize.Deserialize(this);
}

IDeserializeType IDeserializer.ReadType(ISerdeInfo typeInfo)
ITypeDeserializer IDeserializer.ReadType(ISerdeInfo typeInfo)
=> throw new DeserializeException("Found nullable ref, expected scalar");
}
Loading