// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@available(added=7)
library fuchsia.data;

// Maximum number of items in a dictionary's value.
const MAX_NUM_VALUE_ITEMS uint32 = 1024;
const MAX_NUM_ENTRIES uint32 = 1024;
const MAX_KEY_LENGTH uint32 = 1024;

@available(replaced=12)
const MAX_VALUE_LENGTH uint32 = 1024;
@available(added=12, replaced=14)
const MAX_VALUE_LENGTH uint32 = 8192;
@available(added=14)
const MAX_VALUE_LENGTH uint32 = 32768;

/// A dictionary is a sequence of key/value pairs.
/// Keys must be unique and sorted in lexicographically increasing order.
type Dictionary = table {
    // A list of dictionary entries, where each entry is a (key, value) pair.
    //
    // Required.
    1: entries vector<DictionaryEntry>:MAX_NUM_ENTRIES;
};

/// A key/value pair in a `Dictionary`.
type DictionaryEntry = struct {
    // The key for a dictionary entry.
    key string:MAX_KEY_LENGTH;

    // The value associated with the `key`.
    value DictionaryValue:optional;
};

/// A dictionary's value is a string, a list of strings, or a list of objects.
type DictionaryValue = flexible union {
    1: str string:MAX_VALUE_LENGTH;
    2: str_vec vector<string:MAX_VALUE_LENGTH>:MAX_NUM_VALUE_ITEMS;
    3: obj_vec vector<Dictionary>:MAX_NUM_VALUE_ITEMS;
};
