aboutsummaryrefslogtreecommitdiff
path: root/lib/application-service/definitions/protocol.h
blob: 213dbf19a84e5dfbba8b37b68df9f07962bde56c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { c
/******************************************************************************
 * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN
 */

#pragma once

#include "converters.h"

namespace Quotient {
/// Definition of valid values for a field.
struct FieldType {
    /// A regular expression for validation of a field's value. This may be
    /// relatively coarse to verify the value as the application service
    /// providing this protocol may apply additional validation or filtering.
    QString regexp;

    /// An placeholder serving as a valid example of the field value.
    QString placeholder;
};

template <>
struct JsonObjectConverter<FieldType> {
    static void dumpTo(QJsonObject& jo, const FieldType& pod)
    {
        addParam<>(jo, QStringLiteral("regexp"), pod.regexp);
        addParam<>(jo, QStringLiteral("placeholder"), pod.placeholder);
    }
    static void fillFrom(const QJsonObject& jo, FieldType& pod)
    {
        fromJson(jo.value("regexp"_ls), pod.regexp);
        fromJson(jo.value("placeholder"_ls), pod.placeholder);
    }
};

struct ProtocolInstance {
    /// A human-readable description for the protocol, such as the name.
    QString desc;

    /// An optional content URI representing the protocol. Overrides the one
    /// provided at the higher level Protocol object.
    QString icon;

    /// Preset values for `fields` the client may use to search by.
    QJsonObject fields;

    /// A unique identifier across all instances.
    QString networkId;
};

template <>
struct JsonObjectConverter<ProtocolInstance> {
    static void dumpTo(QJsonObject& jo, const ProtocolInstance& pod)
    {
        addParam<>(jo, QStringLiteral("desc"), pod.desc);
        addParam<IfNotEmpty>(jo, QStringLiteral("icon"), pod.icon);
        addParam<>(jo, QStringLiteral("fields"), pod.fields);
        addParam<>(jo, QStringLiteral("network_id"), pod.networkId);
    }
    static void fillFrom(const QJsonObject& jo, ProtocolInstance& pod)
    {
        fromJson(jo.value("desc"_ls), pod.desc);
        fromJson(jo.value("icon"_ls), pod.icon);
        fromJson(jo.value("fields"_ls), pod.fields);
        fromJson(jo.value("network_id"_ls), pod.networkId);
    }
};

struct ThirdPartyProtocol {
    /// Fields which may be used to identify a third party user. These should be
    /// ordered to suggest the way that entities may be grouped, where higher
    /// groupings are ordered first. For example, the name of a network should
    /// be searched before the nickname of a user.
    QStringList userFields;

    /// Fields which may be used to identify a third party location. These
    /// should be ordered to suggest the way that entities may be grouped, where
    /// higher groupings are ordered first. For example, the name of a network
    /// should be searched before the name of a channel.
    QStringList locationFields;

    /// A content URI representing an icon for the third party protocol.
    QString icon;

    /// The type definitions for the fields defined in the `user_fields` and
    /// `location_fields`. Each entry in those arrays MUST have an entry here.
    /// The `string` key for this object is field name itself.
    ///
    /// May be an empty object if no fields are defined.
    QHash<QString, FieldType> fieldTypes;

    /// A list of objects representing independent instances of configuration.
    /// For example, multiple networks on IRC if multiple are provided by the
    /// same application service.
    QVector<ProtocolInstance> instances;
};

template <>
struct JsonObjectConverter<ThirdPartyProtocol> {
    static void dumpTo(QJsonObject& jo, const ThirdPartyProtocol& pod)
    {
        addParam<>(jo, QStringLiteral("user_fields"), pod.userFields);
        addParam<>(jo, QStringLiteral("location_fields"), pod.locationFields);
        addParam<>(jo, QStringLiteral("icon"), pod.icon);
        addParam<>(jo, QStringLiteral("field_types"), pod.fieldTypes);
        addParam<>(jo, QStringLiteral("instances"), pod.instances);
    }
    static void fillFrom(const QJsonObject& jo, ThirdPartyProtocol& pod)
    {
        fromJson(jo.value("user_fields"_ls), pod.userFields);
        fromJson(jo.value("location_fields"_ls), pod.locationFields);
        fromJson(jo.value("icon"_ls), pod.icon);
        fromJson(jo.value("field_types"_ls), pod.fieldTypes);
        fromJson(jo.value("instances"_ls), pod.instances);
    }
};

} // namespace Quotient