blob: 6e6357dc8717c84690c08a8a5d0d2b20f0c04788 [file] [log] [blame]
// 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.
#ifndef SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_SETTING_SCHEMA_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_SETTING_SCHEMA_H_
#include <map>
#include "src/developer/debug/zxdb/client/setting_value.h"
#include "src/developer/debug/zxdb/common/err.h"
#include "src/lib/fxl/memory/ref_counted.h"
namespace zxdb {
// Stores the setting information for a particular context. These are meant to be used for
// validation of settings for particular objects (thread, process, etc.).
class SettingSchema : public fxl::RefCountedThreadSafe<SettingSchema> {
public:
// The SchemaSetting holds the actual setting (the value that is stored and overridden by
// SettingStore) + some metadata useful for implementing more complex settings such as enums, by
// using the |options| field.
struct Record {
std::string name;
std::string description;
SettingValue default_value;
std::vector<std::string> options; // Used only for string lists.
};
bool HasSetting(const std::string& key);
bool empty() const { return settings_.empty(); }
// Returns a null record pointer if the schema does not support a setting with that name.
const Record* GetSetting(const std::string& name) const;
const std::map<std::string, Record>& settings() const { return settings_; }
// Create new items for simple settings that only belong to this schema. For inter-schema options
// or for the more complex schema types, create the Setting separately and then insert it to each
// schema with AddSetting().
//
// For the String variant, it can take a list of valid options which new values must match to
// validate against. This is done as a case-sensitive comparison.
void AddBool(std::string name, std::string description, bool value = false);
void AddInt(std::string name, std::string description, int value = 0);
void AddExecutionScope(std::string name, std::string description,
const ExecutionScope value = ExecutionScope());
void AddInputLocations(std::string name, std::string description,
std::vector<InputLocation> = {});
void AddString(std::string name, std::string description, std::string value = {},
std::vector<std::string> valid_options = {});
// |valid_options| determines which list values will be accepted when writing into a setting which
// allows implementation of a list of enumerations.
//
// Will return false if the given list has a entry that is not within the valid options.
bool AddList(std::string name, std::string description, std::vector<std::string> list = {},
std::vector<std::string> valid_options = {});
// |valid_options| determines which list values will be accepted when writing into a string or
// list setting which allows implementation of a list of enumerations.
//
// In the future if we need enums that aren't strings, the valid_options vector should be changed
// to a vector<SettingValue>.
void AddSetting(std::string name, std::string description, SettingValue default_value,
std::vector<std::string> valid_options = {});
Err ValidateSetting(const std::string& key, const SettingValue&) const;
private:
std::map<std::string, Record> settings_;
};
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_SETTING_SCHEMA_H_