libcamera: Introduce YamlParser as a helper to parse yaml files
Introduce YamlParser as a helper to convert contents of a yaml file to a tree based structure for easier reading, and to avoid writing parser with raw yaml tokens. The class is based on libyaml, and only support reading but not writing a yaml file. The interface is inspired by Json::Value class from jsoncpp: http://jsoncpp.sourceforge.net/class_json_1_1_value.html Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
committed by
Laurent Pinchart
parent
c70323e494
commit
fcb0ea001a
@@ -42,4 +42,5 @@ libcamera_internal_headers = files([
|
||||
'v4l2_pixelformat.h',
|
||||
'v4l2_subdevice.h',
|
||||
'v4l2_videodevice.h',
|
||||
'yaml_parser.h',
|
||||
])
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
/*
|
||||
* Copyright (C) 2022, Google Inc.
|
||||
*
|
||||
* yaml_parser.h - libcamera YAML parsing helper
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstdio>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <libcamera/base/class.h>
|
||||
|
||||
#include <libcamera/geometry.h>
|
||||
|
||||
namespace libcamera {
|
||||
|
||||
class YamlParserContext;
|
||||
|
||||
class YamlObject
|
||||
{
|
||||
public:
|
||||
YamlObject();
|
||||
~YamlObject();
|
||||
|
||||
bool isValue() const
|
||||
{
|
||||
return type_ == Value;
|
||||
}
|
||||
bool isList() const
|
||||
{
|
||||
return type_ == List;
|
||||
}
|
||||
bool isDictionary() const
|
||||
{
|
||||
return type_ == Dictionary;
|
||||
}
|
||||
|
||||
#ifndef __DOXYGEN__
|
||||
template<typename T,
|
||||
typename std::enable_if_t<
|
||||
std::is_same<bool, T>::value ||
|
||||
std::is_same<double, T>::value ||
|
||||
std::is_same<int32_t, T>::value ||
|
||||
std::is_same<uint32_t, T>::value ||
|
||||
std::is_same<std::string, T>::value ||
|
||||
std::is_same<Size, T>::value> * = nullptr>
|
||||
#else
|
||||
template<typename T>
|
||||
#endif
|
||||
T get(const T &defaultValue, bool *ok = nullptr) const;
|
||||
|
||||
std::size_t size() const;
|
||||
const YamlObject &operator[](std::size_t index) const;
|
||||
|
||||
bool contains(const std::string &key) const;
|
||||
const YamlObject &operator[](const std::string &key) const;
|
||||
std::vector<std::string> memberNames() const;
|
||||
|
||||
private:
|
||||
LIBCAMERA_DISABLE_COPY_AND_MOVE(YamlObject)
|
||||
|
||||
friend class YamlParserContext;
|
||||
|
||||
enum Type {
|
||||
Dictionary,
|
||||
List,
|
||||
Value,
|
||||
};
|
||||
|
||||
Type type_;
|
||||
|
||||
std::string value_;
|
||||
std::vector<std::unique_ptr<YamlObject>> list_;
|
||||
std::map<const std::string, std::unique_ptr<YamlObject>> dictionary_;
|
||||
};
|
||||
|
||||
class YamlParser final
|
||||
{
|
||||
public:
|
||||
static std::unique_ptr<YamlObject> parse(std::FILE *fh);
|
||||
};
|
||||
|
||||
} /* namespace libcamera */
|
||||
Reference in New Issue
Block a user