Rework proto parsing to use javascript objects, add nested and object message support

Objects are preferred to classes as they're easier to clone and serialise/deserialise
This commit is contained in:
2024-06-26 21:51:43 +09:30
parent d484f75540
commit da8861cde2
3 changed files with 191 additions and 62 deletions

View File

@@ -1,27 +1,80 @@
export class StringMessage implements MessageConfiguration {
constructor(public maxLength?: number) {}
export enum MessageTypeEnum {
String = 'string',
Boolean = 'boolean',
Numeric = 'numeric',
List = 'list',
Map = 'map',
Object = 'object',
Raw = 'raw',
}
export class BooleanMessage implements MessageConfiguration {}
export class NumericMessage implements MessageConfiguration {
constructor(public min?: number, public max?: number) {}
export interface StringMessage extends MessageConfiguration {
maxLength?: number;
}
export class ListMessage implements MessageConfiguration {
constructor(readonly subConfiguration: MessageConfiguration) {}
export interface BooleanMessage extends MessageConfiguration {}
export interface NumericMessage extends MessageConfiguration {
min?: number;
max?: number;
}
export class MapMessage implements MessageConfiguration {
constructor(
readonly keyConfiguration: MessageConfiguration,
readonly valueConfiguration: MessageConfiguration
) {}
export interface ListMessage extends MessageConfiguration {
subConfiguration: MessageConfiguration;
}
export class ObjectMessage implements MessageConfiguration {}
export interface MapMessage extends MessageConfiguration {
keyConfiguration: MessageConfiguration;
valueConfiguration: MessageConfiguration;
}
export class MessageConfiguration {}
export interface ObjectMessage extends MessageConfiguration {
messageDefinition: ProtoMessage;
}
export interface RawMessage extends MessageConfiguration {}
export interface MessageConfiguration {
type: MessageTypeEnum;
}
export const StringMessage = (maxLength?: number): StringMessage => ({
type: MessageTypeEnum.String,
maxLength,
});
export const BooleanMessage = (): BooleanMessage => ({
type: MessageTypeEnum.Boolean,
});
export const NumericMessage = (min?: number, max?: number): NumericMessage => ({
type: MessageTypeEnum.Numeric,
min,
max,
});
export const ListMessage = (
subConfiguration: MessageConfiguration
): ListMessage => ({
type: MessageTypeEnum.List,
subConfiguration,
});
export const MapMessage = (
keyConfiguration: MessageConfiguration,
valueConfiguration: MessageConfiguration
): MapMessage => ({
type: MessageTypeEnum.Map,
keyConfiguration,
valueConfiguration,
});
export const ObjectMessage = (messageDefinition: ProtoMessage) => ({
type: MessageTypeEnum.Object,
messageDefinition,
});
export const RawMessage = (): RawMessage => ({ type: MessageTypeEnum.Raw });
export interface ProtoMessageField {
name: string;
@@ -33,3 +86,8 @@ export interface ProtoMessage {
name: string;
values: ProtoMessageField[];
}
export const UnknownProto = (name: string): ProtoMessage => ({
name,
values: [{ name: 'Raw JSON', configuration: RawMessage(), value: '' }],
});