export interface IProtocol {
version: Protocol.Version;
domains: Protocol.Domain[];
}
export namespace Protocol {
export interface Version {
major: string;
minor: string;
}
export interface Domain {
domain: string;
description?: string;
dependencies?: string[];
types?: DomainType[];
commands?: Command[];
events?: Event[];
}
export interface Command extends Event {
returns?: PropertyType[];
async?: boolean;
redirect?: string;
}
export interface Event {
name: string;
parameters?: PropertyType[];
description?: string;
}
export interface ArrayType {
type: 'array';
items: RefType | PrimitiveType | StringType | AnyType | ObjectType;
minItems?: number;
maxItems?: number;
}
export interface ObjectType {
type: 'object';
properties?: PropertyType[];
}
export interface StringType {
type: 'string';
enum?: string[];
}
export interface PrimitiveType {
type: 'number' | 'integer' | 'boolean';
}
export interface AnyType {
type: 'any';
}
export interface RefType {
$ref: string;
}
export interface PropertyBaseType {
name: string;
optional?: boolean;
description?: string;
}
type DomainType = {
id: string;
description?: string;
} & (StringType | ObjectType | ArrayType | PrimitiveType);
type ProtocolType = StringType | ObjectType | ArrayType | PrimitiveType | RefType | AnyType;
type PropertyType = PropertyBaseType & ProtocolType;
}