{
    "id": "http://spacebrew.cc/messaging-schema#",
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "a schema defining the messages sent by clients and admins",
    "type": "object",
    "oneOf": [
        {
            "$ref": "#/definitions/config"
        },
        {
            "$ref": "#/definitions/message"
        },
        {
            "$ref": "#/definitions/admin"
        },
        {
            "$ref": "#/definitions/route"
        }
    ],
    "definitions": {
        "config": {
            "type": "object",
            "required": [
                "config"
            ],
            "properties": {
                "config": {
                    "type": "object",
                    "required": [
                        "name",
                        "description"
                    ],
                    "properties": {
                        "name": {
                            "type": "string"
                        },
                        "description": {
                            "type": "string"
                        },
                        "subscribe": {
                            "type": "object",
                            "properties": {
                                "messages": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "required": [
                                            "type",
                                            "name"
                                        ],
                                        "properties": {
                                            "type": {
                                                "type": "string"
                                            },
                                            "name": {
                                                "type": "string"
                                            },
                                            "default": {}
                                        }
                                    }
                                }
                            }
                        },
                        "publish": {
                            "type": "object",
                            "properties": {
                                "messages": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "required": [
                                            "type",
                                            "name"
                                        ],
                                        "properties": {
                                            "type": {
                                                "type": "string"
                                            },
                                            "name": {
                                                "type": "string"
                                            },
                                            "default": {}
                                        }
                                    }
                                }
                            }
                        },
                        "options": {
                            "type": "object"
                        }
                    }
                }
            }
        },
        "message": {
            "type": "object",
            "required": [
                "message"
            ],
            "properties": {
                "message": {
                    "type": "object",
                    "required": [
                        "clientName",
                        "name",
                        "type",
                        "value"
                    ],
                    "properties": {
                        "clientName": {
                            "type": "string"
                        },
                        "name": {
                            "type": "string"
                        },
                        "type": {
                            "type": "string"
                        },
                        "value": {}
                    }
                }
            }
        },
        "admin": {
            "type": "object",
            "required": [
                "admin"
            ],
            "properties": {
                "admin": {},
                "no_msgs": {}
            }
        },
        "route": {
            "type": "object",
            "required": [
                "route"
            ],
            "properties": {
                "route": {
                    "type": "object",
                    "required": [
                        "publisher",
                        "subscriber",
                        "type"
                    ],
                    "properties": {
                        "type": {
                            "enum": [
                                "add",
                                "remove"
                            ]
                        },
                        "publisher": {
                            "type": "object",
                            "required": [
                                "type",
                                "clientName",
                                "remoteAddress",
                                "name"
                            ],
                            "properties": {
                                "type": {
                                    "type": "string"
                                },
                                "clientName": {
                                    "type": "string"
                                },
                                "name": {
                                    "type": "string"
                                },
                                "remoteAddress": {
                                    "type": "string"
                                }
                            },
                            "subscriber": {
                                "type": "object",
                                "required": [
                                    "type",
                                    "clientName",
                                    "remoteAddress",
                                    "name"
                                ],
                                "properties": {
                                    "type": {
                                        "type": "string"
                                    },
                                    "clientName": {
                                        "type": "string"
                                    },
                                    "name": {
                                        "type": "string"
                                    },
                                    "remoteAddress": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}