arc-isle 0.1.2

The Interface Specification Language for the Arc project: design and implementation
Documentation
Schema {
  hosts = [Host { env: "dev", address: "https://127.0.0.1:5000" }, Host { env: "prod", address: "https://api.your-domain.com" }]
  versioning = Versioning { format: Headers, header: Some("http-standard") }
  types = [Ok(TypeDecl {
    name = update
    at = Ok(DataTypeDecl { data_type: Object("date"), is_required: true })
    is_latest = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
    id = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    note = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
    interested_user_ids = Ok(DataTypeDecl { data_type: Array(Primitive(Int)), is_required: true })
), Ok(TypeDecl {
    name = message
    author = Ok(DataTypeDecl { data_type: Object("user"), is_required: true })
    text = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    update = Ok(DataTypeDecl { data_type: Object("update"), is_required: false })
    marks = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = marks
    read = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
    ack = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
), is_required: true })
), Ok(TypeDecl {
    name = media
    id = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    type = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    versions = Ok(DataTypeDecl { data_type: Object("media"), is_required: true })
    thumbnail = Ok(DataTypeDecl { data_type: Object("media"), is_required: true })
    uploaded = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
    index = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    status = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    caption = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
), Ok(TypeDecl {
    name = media_versions
    normal = Ok(DataTypeDecl { data_type: Object("media"), is_required: true })
    collapsed = Ok(DataTypeDecl { data_type: Object("media"), is_required: true })
    expanded = Ok(DataTypeDecl { data_type: Object("media"), is_required: true })
    tiny = Ok(DataTypeDecl { data_type: Object("media"), is_required: true })
), Ok(TypeDecl {
    name = media_version
    url = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    size = Ok(DataTypeDecl { data_type: Object("size"), is_required: true })
), Ok(TypeDecl {
    name = size
    width = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    height = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
), Ok(TypeDecl {
    name = social_media
    links = Ok(DataTypeDecl { data_type: Array(Object("link")), is_required: false })
    hashtags = Ok(DataTypeDecl { data_type: Array(Object("hashtag")), is_required: false })
    mentions = Ok(DataTypeDecl { data_type: Array(Object("mention")), is_required: false })
), Ok(TypeDecl {
    name = link
    text = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
    indices = Ok(DataTypeDecl { data_type: Array(Primitive(Int)), is_required: false })
), Ok(TypeDecl {
    name = hashtag
    text = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
    indices = Ok(DataTypeDecl { data_type: Array(Primitive(Int)), is_required: false })
), Ok(TypeDecl {
    name = mention
    user = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = user
    id = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
    username = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
    first_name = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
    last_name = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
), is_required: true })
    indices = Ok(DataTypeDecl { data_type: Array(Primitive(Int)), is_required: false })
), Ok(TypeDecl {
    name = settings
    version = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    feed = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = feed
    timeline_order = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = timeline_order
    all = Ok(DataTypeDecl { data_type: Array(Primitive(Str)), is_required: true })
    selected = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
), is_required: true })
), is_required: true })
    categories = Ok(DataTypeDecl { data_type: Array(Object("category")), is_required: true })
    channels = Ok(DataTypeDecl { data_type: Array(Object("channel")), is_required: true })
    filters = Ok(DataTypeDecl { data_type: Array(Object("filter")), is_required: true })
    story = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = story
    backgrounds = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = backgrounds
    backgrounds = Ok(DataTypeDecl { data_type: Array(Object("background")), is_required: true })
    new = Ok(DataTypeDecl { data_type: Array(Object("background")), is_required: true })
    popular = Ok(DataTypeDecl { data_type: Array(Object("background")), is_required: true })
), is_required: true })
    privacy = Ok(DataTypeDecl { data_type: Array(Object("privacy")), is_required: true })
    commenting_privacy = Ok(DataTypeDecl { data_type: Array(Object("commenting_privacy")), is_required: true })
    providers = Ok(DataTypeDecl { data_type: Array(Object("provider")), is_required: true })
    story_types = Ok(DataTypeDecl { data_type: Array(Object("story_type")), is_required: true })
), is_required: true })
    social_accounts = Ok(DataTypeDecl { data_type: Array(Object("social_account")), is_required: true })
), Ok(TypeDecl {
    name = category
    id = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    name = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    enabled = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
), Ok(TypeDecl {
    name = channel
    id = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    caption = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    enabled = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
    default_index = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    readonly = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
    category = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    color = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    index = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
), Ok(TypeDecl {
    name = filter
    id = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    caption = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    enabled = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
    index = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    readonly = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
    channel = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    resource_url = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = resource_url
    svg = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
), is_required: true })
    position = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
), Ok(TypeDecl {
    name = background
    id = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    image = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = image
    full = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    mini = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
), is_required: true })
    position = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    index = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    category_id = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    kind = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
), Ok(TypeDecl {
    name = privacy
    id = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    name = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    value = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
), Ok(TypeDecl {
    name = commenting_privacy
    id = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    name = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    value = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
), Ok(TypeDecl {
    name = provider
    id = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    name = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
), Ok(TypeDecl {
    name = story_type
    id = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    i18n = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = i18n
    name = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
), is_required: true })
    name = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    value = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    enabled = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
    components = Ok(DataTypeDecl { data_type: Array(Primitive(Str)), is_required: true })
    available_content = Ok(DataTypeDecl { data_type: Array(Primitive(Str)), is_required: true })
), Ok(TypeDecl {
    name = new_channel_position
    channel = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
    index = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true })
)]
  interfaces = [Ok(InterfaceDecl { ident: "history", params: [], spec: Api(ApiSpec { method: Get, payload: Some(Query([PropertyDecl { name: "period", data_type_decl: Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true }) }, PropertyDecl { name: "limit", data_type_decl: Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true }) }, PropertyDecl { name: "after", data_type_decl: Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false }) }])), responses: Some({Fixed(200): TypeDecl {
    name = 200
    items = Ok(DataTypeDecl { data_type: Array(Object("update")), is_required: true })
    after = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
}) }) }), Ok(InterfaceDecl { ident: "auth/signin", params: [], spec: Api(ApiSpec { method: Post, payload: Some(Body([PropertyDecl { name: "login", data_type_decl: Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true }) }, PropertyDecl { name: "password", data_type_decl: Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true }) }])), responses: Some({Fixed(200): TypeDecl {
    name = 200
    headers = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = headers
    refresh-token = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
    authorization = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
), is_required: true })
}) }) }), Ok(InterfaceDecl { ident: "auth/signup", params: [], spec: Api(ApiSpec { method: Post, payload: Some(Body([PropertyDecl { name: "login", data_type_decl: Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true }) }, PropertyDecl { name: "password", data_type_decl: Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true }) }])), responses: None }) }), Ok(InterfaceDecl { ident: "auth/logout", params: [], spec: Api(ApiSpec { method: Delete, payload: None, responses: None }) }), Ok(InterfaceDecl { ident: "auth/refresh", params: [], spec: Api(ApiSpec { method: Post, payload: None, responses: Some({Fixed(200): TypeDecl {
    name = 200
    headers = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = headers
    refresh-token = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
    authorization = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
), is_required: true })
}) }) }), Ok(InterfaceDecl { ident: "messages/{message_id}/read_by/", params: ["message_id"], spec: Api(ApiSpec { method: Get, payload: None, responses: None }) }), Ok(InterfaceDecl { ident: "messages/{message_id}/tree/{node_id}/", params: ["message_id", "node_id"], spec: Api(ApiSpec { method: Get, payload: None, responses: None }) }), Ok(InterfaceDecl { ident: "messages/{message_id}/tree/{node_id}/updates/", params: ["message_id", "node_id"], spec: Api(ApiSpec { method: Get, payload: None, responses: None }) }), Ok(InterfaceDecl { ident: "messages/{message_id}/tree/{node_id}/updates/", params: ["message_id", "node_id"], spec: Api(ApiSpec { method: Get, payload: None, responses: None }) }), Ok(InterfaceDecl { ident: "messages", params: [], spec: Api(ApiSpec { method: Get, payload: Some(Query([PropertyDecl { name: "limit", data_type_decl: Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true }) }, PropertyDecl { name: "after", data_type_decl: Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false }) }])), responses: Some({Fixed(200): TypeDecl {
    name = 200
    items = Ok(DataTypeDecl { data_type: Array(Object("message")), is_required: true })
    after = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: false })
}) }) }), 


Ok(InterfaceDecl { 
    ident: "messages",
    params: [], 
    spec: Api(ApiSpec {
        method: Post,
        payload: Some(Body([
            PropertyDecl {
                name: "text",
                data_type_decl: Ok(DataTypeDecl {
                    data_type: Primitive(Str),
                    is_required: true
                })
            },
            PropertyDecl { 
                name: "receiver_id",
                data_type_decl: Ok(DataTypeDecl {
                    data_type: Primitive(Str),
                    is_required: true
                })
            }
        ])), 
        responses: Some({
            Fixed(401): TypeDecl {
                name = 200
                code = Ok(DataTypeDecl { data_type: Primitive(Int), is_required: true }), 
            Fixed(200): TypeDecl {
                name = message
                author = Ok(DataTypeDecl { data_type: Object("user"), is_required: true })
                text = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
                update = Ok(DataTypeDecl { data_type: Object("update"), is_required: false })
                marks = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
                    name = marks
                    read = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
                    ack = Ok(DataTypeDecl { data_type: Primitive(Bool), is_required: true })
                ), is_required: true }),
            Prefix(4): TypeDecl {
                name = 200
                err = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
            })
        })
    }), 


Ok(InterfaceDecl { ident: "messages/{message_id}", params: ["message_id"], spec: Api(ApiSpec { method: Delete, payload: None, responses: None }) }), Ok(InterfaceDecl { ident: "messages/search/{user_id}", params: ["user_id"], spec: Api(ApiSpec { method: Get, payload: None, responses: None }) }), Ok(InterfaceDecl { ident: "messages/read", params: [], spec: Api(ApiSpec { method: Post, payload: Some(Body([PropertyDecl { name: "message_id", data_type_decl: Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true }) }])), responses: None }) }), Ok(InterfaceDecl { ident: "settings", params: [], spec: Api(ApiSpec { method: Get, payload: None, responses: Some({Fixed(200): TypeDecl {
    name = settings
    version = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
    feed = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = feed
    timeline_order = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = timeline_order
    all = Ok(DataTypeDecl { data_type: Array(Primitive(Str)), is_required: true })
    selected = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
), is_required: true })
), is_required: true })
    categories = Ok(DataTypeDecl { data_type: Array(Object("category")), is_required: true })
    channels = Ok(DataTypeDecl { data_type: Array(Object("channel")), is_required: true })
    filters = Ok(DataTypeDecl { data_type: Array(Object("filter")), is_required: true })
    story = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = story
    backgrounds = Ok(DataTypeDecl { data_type: ObjectDecl(TypeDecl {
    name = backgrounds
    backgrounds = Ok(DataTypeDecl { data_type: Array(Object("background")), is_required: true })
    new = Ok(DataTypeDecl { data_type: Array(Object("background")), is_required: true })
    popular = Ok(DataTypeDecl { data_type: Array(Object("background")), is_required: true })
), is_required: true })
    privacy = Ok(DataTypeDecl { data_type: Array(Object("privacy")), is_required: true })
    commenting_privacy = Ok(DataTypeDecl { data_type: Array(Object("commenting_privacy")), is_required: true })
    providers = Ok(DataTypeDecl { data_type: Array(Object("provider")), is_required: true })
    story_types = Ok(DataTypeDecl { data_type: Array(Object("story_type")), is_required: true })
), is_required: true })
    social_accounts = Ok(DataTypeDecl { data_type: Array(Object("social_account")), is_required: true })
}) }) }), Ok(InterfaceDecl { ident: "settings/version", params: [], spec: Api(ApiSpec { method: Get, payload: None, responses: Some({Fixed(200): TypeDecl {
    name = 200
    version = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
}) }) }), Ok(InterfaceDecl { ident: "settings/channels", params: [], spec: Api(ApiSpec { method: Put, payload: Some(Body([PropertyDecl { name: "items", data_type_decl: Ok(DataTypeDecl { data_type: Array(Object("new_channel_position")), is_required: true }) }])), responses: Some({Fixed(200): TypeDecl {
    name = 200
    channels = Ok(DataTypeDecl { data_type: Array(Object("channel")), is_required: true })
}) }) }), Ok(InterfaceDecl { ident: "settings/timeline_order", params: [], spec: Api(ApiSpec { method: Put, payload: Some(Body([PropertyDecl { name: "timeline_order", data_type_decl: Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true }) }])), responses: Some({Fixed(200): TypeDecl {
    name = 200
    timeline_order = Ok(DataTypeDecl { data_type: Primitive(Str), is_required: true })
}) }) })]