| // Copyright 2015 The Chromium OS 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 FIDES_SETTINGS_BLOB_PARSER_H_ |
| #define FIDES_SETTINGS_BLOB_PARSER_H_ |
| |
| #include <functional> |
| #include <memory> |
| #include <string> |
| #include <unordered_map> |
| |
| #include <base/macros.h> |
| |
| #include "fides/blob_ref.h" |
| |
| namespace fides { |
| |
| class LockedSettingsContainer; |
| |
| // A settings blob parser is just a function that creates a SettingsBlob object |
| // from a serialized representation provided as a sequence of bytes. |format| |
| // identifies the file format to expect, which can be used to select the |
| // appropriate parsing logic. |
| using SettingsBlobParserFunction = std::function<std::unique_ptr< |
| LockedSettingsContainer>(const std::string& format, BlobRef data)>; |
| |
| // This is a helper that allows to construct a parser which will delegate to a |
| // set of subordinate parsers depending on format. Note that |
| // SettingsBlobParserRegistry is not copyable, but can be wrapped in std::ref() |
| // to turn it into a callable that can be used as a SettingsBlobParserFunction. |
| class SettingsBlobParserRegistry { |
| public: |
| SettingsBlobParserRegistry(); |
| |
| // Register a parser for the specified format. |
| void Register(const std::string& format, |
| const SettingsBlobParserFunction& parser); |
| |
| // Run the parsers, return the SettingsBlob generated by the parser registered |
| // to handle |format|. Returns nullptr if there is no parser for |format| or |
| // the parser fails to parse |data|. |
| std::unique_ptr<LockedSettingsContainer> operator()(const std::string& format, |
| BlobRef data) const; |
| |
| private: |
| std::unordered_map<std::string, SettingsBlobParserFunction> parsers_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SettingsBlobParserRegistry); |
| }; |
| |
| } // namespace fides |
| |
| #endif // FIDES_SETTINGS_BLOB_PARSER_H_ |