| /** |
| @section license License |
| |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| #pragma once |
| |
| #include <iostream> |
| #include <fstream> |
| #include <utility> |
| |
| #include "tscore/ArgParser.h" |
| #include "CtrlCommands.h" |
| #include "swoc/TextView.h" |
| |
| /// @brief Very basic flat YAML node handling. |
| /// |
| /// The whole idea is to be able to set some YAML nodes and being able to search for flat nodes, nodes |
| /// can be created if requested. This should also help on creating the whole node tree from a legacy |
| /// record variable style. For more complex updates we should tweak this class a bit. |
| struct FlatYAMLAccessor { |
| /// |
| /// @brief Find a node based on the passed record variable name. |
| /// |
| /// This function will only search for a specific node, it will not create one. |
| /// @param variable the record name. |
| /// @return std::pair<bool, YAML::Node> First value will be set to true if found and the relevant Node will be set in the second |
| /// parameter |
| /// |
| |
| std::pair<bool, YAML::Node> find_node(swoc::TextView variable); |
| /// @brief Find a node based on the passed record variable name. Create if not exist. |
| /// |
| /// This function will first try to find the passed variable, if not it will create a new with the passed tree. |
| /// @param variable the record name. |
| /// @param all_docs Search in all the nodes from the parsed stream. Default is true. No need to change this now. |
| /// @return |
| YAML::Node find_or_create_node(swoc::TextView variable, bool all_docs = true); |
| |
| /// @brief Build up a YAML node including TAG and Value. This is used to append just a single variable in a file. |
| /// @param variable The record name. |
| /// @param value The value to be set on the node. |
| /// @param tag The tag to be set on the node. |
| /// @param out The YAML::Emitter used to build up the node. This can just be streamed out to a string or a file. |
| void make_tree_node(swoc::TextView variable, swoc::TextView value, swoc::TextView tag, YAML::Emitter &out); |
| |
| /// @brief Set the internal list of nodes from the parsed file. Caller should deal with the YAML::LoadAll or any other way. |
| /// @param streams A list of docs. |
| void |
| load(std::vector<YAML::Node> streams) |
| { |
| _docs = std::move(streams); |
| } |
| |
| protected: |
| std::vector<YAML::Node> _docs; |
| }; |
| |
| /// @brief Class used to deal with the config file changes. Append or modify an existing records.yaml field |
| class FileConfigCommand : public CtrlCommand, FlatYAMLAccessor |
| { |
| static inline const std::string SET_STR{"set"}; // we support get, set only for now. |
| static inline const std::string GET_STR{"get"}; |
| |
| static inline const std::string COLD_STR{"cold"}; // Meaning that the change is on a file. |
| static inline const std::string UPDATE_STR{"update"}; // Append the new field to a file. |
| |
| void config_set(); |
| void config_get(); |
| |
| public: |
| FileConfigCommand(ts::Arguments *args); |
| }; |