1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright 2016, Olivier MATZ <zer0@droids-corp.org>
10 #include <ecoli_malloc.h>
11 #include <ecoli_log.h>
12 #include <ecoli_test.h>
13 #include <ecoli_strvec.h>
14 #include <ecoli_node.h>
15 #include <ecoli_parse.h>
16 #include <ecoli_complete.h>
17 #include <ecoli_dict.h>
18 #include <ecoli_config.h>
19 #include <ecoli_node_any.h>
21 EC_LOG_TYPE_REGISTER(node_any);
27 static int ec_node_any_parse(const struct ec_node *node,
28 struct ec_pnode *state,
29 const struct ec_strvec *strvec)
31 struct ec_node_any *priv = ec_node_priv(node);
32 const struct ec_dict *attrs;
36 if (ec_strvec_len(strvec) == 0)
37 return EC_PARSE_NOMATCH;
38 if (priv->attr_name != NULL) {
39 attrs = ec_strvec_get_attrs(strvec, 0);
40 if (attrs == NULL || !ec_dict_has_key(attrs, priv->attr_name))
41 return EC_PARSE_NOMATCH;
47 static void ec_node_any_free_priv(struct ec_node *node)
49 struct ec_node_any *priv = ec_node_priv(node);
51 ec_free(priv->attr_name);
54 static const struct ec_config_schema ec_node_any_schema[] = {
57 .desc = "The optional attribute name to attach.",
58 .type = EC_CONFIG_TYPE_STRING,
61 .type = EC_CONFIG_TYPE_NONE,
65 static int ec_node_any_set_config(struct ec_node *node,
66 const struct ec_config *config)
68 struct ec_node_any *priv = ec_node_priv(node);
69 const struct ec_config *value = NULL;
72 value = ec_config_dict_get(config, "attr");
74 s = ec_strdup(value->string);
79 ec_free(priv->attr_name);
89 static struct ec_node_type ec_node_any_type = {
91 .schema = ec_node_any_schema,
92 .set_config = ec_node_any_set_config,
93 .parse = ec_node_any_parse,
94 .complete = ec_complete_unknown,
95 .size = sizeof(struct ec_node_any),
96 .free_priv = ec_node_any_free_priv,
99 EC_NODE_TYPE_REGISTER(ec_node_any_type);
102 ec_node_any(const char *id, const char *attr)
104 struct ec_config *config = NULL;
105 struct ec_node *node = NULL;
108 node = ec_node_from_type(&ec_node_any_type, id);
112 config = ec_config_dict();
116 ret = ec_config_dict_set(config, "attr", ec_config_string(attr));
120 ret = ec_node_set_config(node, config);
128 ec_config_free(config);
133 /* LCOV_EXCL_START */
134 static int ec_node_any_testcase(void)
136 struct ec_node *node;
139 node = ec_node("any", EC_NO_ID);
141 EC_LOG(EC_LOG_ERR, "cannot create node\n");
144 testres |= EC_TEST_CHECK_PARSE(node, 1, "foo");
145 testres |= EC_TEST_CHECK_PARSE(node, 1, "foo", "bar");
146 testres |= EC_TEST_CHECK_PARSE(node, -1);
149 /* never completes */
150 node = ec_node("any", EC_NO_ID);
152 EC_LOG(EC_LOG_ERR, "cannot create node\n");
155 testres |= EC_TEST_CHECK_COMPLETE(node,
158 testres |= EC_TEST_CHECK_COMPLETE(node,
167 static struct ec_test ec_node_any_test = {
169 .test = ec_node_any_testcase,
172 EC_TEST_REGISTER(ec_node_any_test);