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:
@@ -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: '' }],
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user