From 0ab73d70395747c31c15557501e27d13bf278418 Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Mon, 7 Oct 2024 11:19:51 +0200 Subject: WIP Signed-off-by: Jacopo Mondi --- include/libcamera/internal/yaml_emitter.h | 98 ++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 3 deletions(-) (limited to 'include') diff --git a/include/libcamera/internal/yaml_emitter.h b/include/libcamera/internal/yaml_emitter.h index f8df5265..14ea8241 100644 --- a/include/libcamera/internal/yaml_emitter.h +++ b/include/libcamera/internal/yaml_emitter.h @@ -9,7 +9,9 @@ #include #include +#include #include +#include #include #include @@ -21,15 +23,105 @@ namespace libcamera { class File; class YamlEvent; +class YamlEmitter; +class YamlDict; +class YamlList; + +class YamlOutput +{ +protected: + enum class YamlType { + Root, + Scalar, + Dict, + List, + }; + +public: + virtual ~YamlOutput() {} + virtual void close() {} + + std::unique_ptr dict(); + std::unique_ptr list(); + + YamlType type() { return type_; } + +protected: + YamlOutput(YamlEmitter *emitter, YamlType type) + : emitter_(emitter), type_(type) + { + } + + int emitScalar(std::string_view scalar); + int emitMappingStart(); + int emitMappingEnd(); + int emitSequenceStart(); + int emitSequenceEnd(); + + YamlEmitter *emitter_; + YamlType type_; +}; + +class YamlRoot : public YamlOutput +{ +public: + ~YamlRoot() {} + + std::unique_ptr list(); + std::unique_ptr dict(); + void scalar(std::string_view scalar); + +private: + friend class YamlEmitter; + + YamlRoot(YamlEmitter *emitter) + : YamlOutput(emitter, YamlType::Root) + { + emitterRoot_ = std::unique_ptr(emitter); + } + + std::unique_ptr emitterRoot_; +}; + +class YamlList : public YamlOutput +{ +public: + ~YamlList(); + + std::unique_ptr list(); + std::unique_ptr dict(); + void scalar(std::string_view scalar); + +private: + friend class YamlOutput; + + YamlList(YamlEmitter *emitter); +}; + + +class YamlDict : public YamlOutput +{ +public: + ~YamlDict(); + + void scalar(std::string_view key, std::string_view value); + std::unique_ptr list(std::string_view key); + std::unique_ptr dict(std::string_view key); + +private: + friend class YamlOutput; + + YamlDict(YamlEmitter *emitter); +}; + class YamlEmitter final { public: ~YamlEmitter(); - static std::unique_ptr create(std::string &path); + static std::unique_ptr root(std::string &path); - int emit(std::map); - int emit(const std::string &scalar); + int emit(YamlEvent *event); private: LIBCAMERA_DISABLE_COPY(YamlEmitter); -- cgit v1.2.1