// Copyright 2020 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.
library fuchsia.boot;

const MAX_ARGS_NAME_LENGTH uint8 = 64;
const MAX_ARGS_VALUE_LENGTH uint8 = 128;
// MAX_ARGS_NAME_LENGTH + MAX_ARGS_VALUE_LENGTH + 1 (for '=')
const MAX_ARGS_COLLECT_LENGTH uint8 = 193;
const MAX_ARGS_VECTOR_LENGTH uint8 = 32;

type BoolPair = struct {
    key string:MAX_ARGS_NAME_LENGTH;
    defaultval bool;
};

/// Protocol for retrieving boot arguments.
@discoverable
protocol Arguments {
    /// Get the value of a boot argument `key`.
    GetString(struct {
        key string:MAX_ARGS_NAME_LENGTH;
    }) -> (struct {
        value string:<MAX_ARGS_VALUE_LENGTH, optional>;
    });

    /// Get the values of a list of arguments specified in `keys`.
    GetStrings(struct {
        keys vector<string:MAX_ARGS_NAME_LENGTH>:MAX_ARGS_VECTOR_LENGTH;
    }) -> (struct {
        values vector<string:<MAX_ARGS_VALUE_LENGTH, optional>>:MAX_ARGS_COLLECT_LENGTH;
    });

    /// Get the boolean value of a boot argument `keys`,
    /// or return `defaultval` if the argument is not present.
    /// A key is considered to be false if its string value is exactly
    /// "off", "0", or "false". Any other value (including empty) is returned
    /// as true.
    GetBool(struct {
        key string:MAX_ARGS_NAME_LENGTH;
        defaultval bool;
    }) -> (struct {
        value bool;
    });

    /// Get the boolean values of a list of boot arguments `keys.key`,
    /// or return `keys.defaultval` for each if not present.
    GetBools(struct {
        keys vector<BoolPair>:MAX_ARGS_VECTOR_LENGTH;
    }) -> (struct {
        values vector<bool>:MAX_ARGS_VECTOR_LENGTH;
    });

    /// Get all boot arguments with keys starting with
    /// `prefix`. Returns a vector with strings of the form 'key=value'.
    /// TODO(fxbug.dev/33460) - remove Collect once boot arguments have been componentised.
    Collect(struct {
        prefix string:MAX_ARGS_NAME_LENGTH;
    }) -> (struct {
        results vector<string:MAX_ARGS_COLLECT_LENGTH>:MAX_ARGS_VECTOR_LENGTH;
    });
};
