Review PowerDns types

This commit is contained in:
Jöran Malek 2024-01-02 00:14:28 +01:00
parent ea5f732e24
commit 69b2de4613
4 changed files with 22 additions and 16 deletions

View file

@ -23,6 +23,6 @@ public abstract class Method<TParam>(TParam parameters) : Method
public TParam Parameters => parameters; public TParam Parameters => parameters;
} }
public class InitializeMethod(InitializeMethodParameters parameters) : Method<InitializeMethodParameters>(parameters), IMethod; public class InitializeMethod(InitializeParameters parameters) : Method<InitializeParameters>(parameters), IMethod;
public class LookupMethod(LookupMethodParameters parameters) : Method<LookupMethodParameters>(parameters), IMethod; public class LookupMethod(LookupParameters parameters) : Method<LookupParameters>(parameters), IMethod;

View file

@ -11,12 +11,12 @@ public record class MethodParameters : Parameters
public Dictionary<string, JsonElement> AdditionalProperties { get; set; } = []; public Dictionary<string, JsonElement> AdditionalProperties { get; set; } = [];
} }
public record class InitializeMethodParameters( public record class InitializeParameters(
[property: JsonPropertyName("command")] string Command, [property: JsonPropertyName("command")] string Command,
[property: JsonPropertyName("timeout")] int Timeout [property: JsonPropertyName("timeout")] int Timeout
) : MethodParameters; ) : MethodParameters;
public record class LookupMethodParameters( public record class LookupParameters(
[property: JsonPropertyName("qtype")] string Qtype, [property: JsonPropertyName("qtype")] string Qtype,
[property: JsonPropertyName("qname")] string Qname, [property: JsonPropertyName("qname")] string Qname,
[property: JsonPropertyName("remote")] string Remote, [property: JsonPropertyName("remote")] string Remote,

View file

@ -53,7 +53,7 @@ public class PowerDnsHandler : ConnectionHandler
catch (Exception e) { } catch (Exception e) { }
await JsonSerializer.SerializeAsync(writer, reply, ReplyContext.Default.Reply, connection.ConnectionClosed) await JsonSerializer.SerializeAsync(writer, reply, ReplyContext.Default.Reply, connection.ConnectionClosed)
.ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing); .ConfigureAwait(continueOnCapturedContext: false);
} }
} }
@ -106,22 +106,28 @@ public class PowerDnsHandler : ConnectionHandler
InitializeMethod { Parameters: { } init } => HandleInitialize(init), InitializeMethod { Parameters: { } init } => HandleInitialize(init),
LookupMethod { Parameters: { } lookup } => HandleLookup(lookup), LookupMethod { Parameters: { } lookup } => HandleLookup(lookup),
_ => ValueTask.FromResult<Reply>(new BoolReply(false)) _ => LogUnhandled(_logger, method)
}; };
static ValueTask<Reply> LogUnhandled(ILogger logger, Method method)
{
logger.LogWarning("Unhandled Method {Method}", method);
return ValueTask.FromResult<Reply>(BoolReply.False);
}
} }
private ValueTask<Reply> HandleInitialize(InitializeMethodParameters method) private ValueTask<Reply> HandleInitialize(InitializeParameters parameters)
{ {
return ValueTask.FromResult(BoolReply.True); return ValueTask.FromResult<Reply>(BoolReply.True);
} }
private ValueTask<Reply> HandleLookup(LookupMethodParameters method) private ValueTask<Reply> HandleLookup(LookupParameters parameters)
{ {
switch (method.Qtype.ToLowerInvariant()) switch (parameters.Qtype.ToUpperInvariant())
{ {
default: default:
_logger.LogWarning("Unhandled QType {QType}", method.Qtype); _logger.LogWarning("Unhandled QType {QType}", parameters.Qtype);
return ValueTask.FromResult(BoolReply.False); return ValueTask.FromResult<Reply>(BoolReply.False);
} }
} }
} }

View file

@ -7,22 +7,22 @@ namespace pdns_dhcp.PowerDns;
public abstract class Reply; public abstract class Reply;
[JsonSerializable(typeof(Reply)), JsonSourceGenerationOptions( [JsonSerializable(typeof(Reply)), JsonSourceGenerationOptions(
GenerationMode = JsonSourceGenerationMode.Serialization, GenerationMode = JsonSourceGenerationMode.Metadata,
PropertyNamingPolicy = JsonKnownNamingPolicy.KebabCaseLower,
WriteIndented = false WriteIndented = false
)] )]
internal partial class ReplyContext : JsonSerializerContext; internal partial class ReplyContext : JsonSerializerContext;
public abstract class Reply<T>(T result) : Reply public abstract class Reply<T>(T result) : Reply
{ {
[JsonPropertyName("result")]
public T Result => result; public T Result => result;
} }
public class BoolReply(bool result) : Reply<bool>(result) public class BoolReply(bool result) : Reply<bool>(result)
{ {
public static Reply False { get; } = new BoolReply(false); public static BoolReply False { get; } = new BoolReply(false);
public static Reply True { get; } = new BoolReply(true); public static BoolReply True { get; } = new BoolReply(true);
} }
public class LookupReply(QueryResult[] result) : Reply<QueryResult[]>(result); public class LookupReply(QueryResult[] result) : Reply<QueryResult[]>(result);