Files
bufpiv/src/app/model/proto-message.model.ts
vato007 da8861cde2 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
2024-06-26 21:51:43 +09:30

94 lines
2.1 KiB
TypeScript

export enum MessageTypeEnum {
String = 'string',
Boolean = 'boolean',
Numeric = 'numeric',
List = 'list',
Map = 'map',
Object = 'object',
Raw = 'raw',
}
export interface StringMessage extends MessageConfiguration {
maxLength?: number;
}
export interface BooleanMessage extends MessageConfiguration {}
export interface NumericMessage extends MessageConfiguration {
min?: number;
max?: number;
}
export interface ListMessage extends MessageConfiguration {
subConfiguration: MessageConfiguration;
}
export interface MapMessage extends MessageConfiguration {
keyConfiguration: MessageConfiguration;
valueConfiguration: 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;
configuration: MessageConfiguration;
value: any;
}
export interface ProtoMessage {
name: string;
values: ProtoMessageField[];
}
export const UnknownProto = (name: string): ProtoMessage => ({
name,
values: [{ name: 'Raw JSON', configuration: RawMessage(), value: '' }],
});