From 0249399f06ab77c58e02698a6a0b2352f0dbf1ae Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 7 Feb 2024 13:57:20 +0200 Subject: Add $json.object_names() function --- libbuild2/functions-json.cxx | 76 +++++++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 26 deletions(-) (limited to 'libbuild2') diff --git a/libbuild2/functions-json.cxx b/libbuild2/functions-json.cxx index ae5bd77..5715e13 100644 --- a/libbuild2/functions-json.cxx +++ b/libbuild2/functions-json.cxx @@ -45,7 +45,39 @@ namespace build2 return to_string (v.type, dn); }; - // $member_name() + // $value_size() + // + // Return the size of a JSON value. + // + // The size of a `null` value is `0`. The sizes of simple values + // (`boolean`, `number`, and `string`) is `1`. The size of `array` and + // `object` values is the number of elements and members, respectively. + // + // Note that the size of a `string` JSON value is not the length of the + // string. To get the length call `$string.size()` instead by casting the + // JSON value to the `string` value type. + // + f["value_size"] += [] (json_value v) -> size_t + { + // Note: should be consistent with value_traits::empty(), + // json_subscript(). + // + switch (v.type) + { + case json_type::null: return 0; + case json_type::boolean: + case json_type::signed_number: + case json_type::unsigned_number: + case json_type::hexadecimal_number: + case json_type::string: break; + case json_type::array: return v.array.size (); + case json_type::object: return v.object.size (); + } + + return 1; + }; + + // $member_name() // // Return the name of a JSON object member. // @@ -60,7 +92,7 @@ namespace build2 fail << "json object member expected instead of " << v.type << endf; }; - // $member_value() + // $member_value() // // Return the value of a JSON object member. // @@ -97,36 +129,28 @@ namespace build2 fail << "json object member expected instead of " << v.type << endf; }; - // $value_size() + // $object_names() // - // Return the size of a JSON value. + // Return the list of names in the JSON object. If the JSON `null` is + // passed instead, assume it is a missing object and return an empty list. // - // The size of a `null` value is `0`. The sizes of simple values - // (`boolean`, `number`, and `string`) is `1`. The size of `array` and - // `object` values is the number of elements and members, respectively. - // - // Note that the size of a `string` JSON value is not the length of the - // string. To get the length call `$string.size()` instead by casting the - // JSON value to the `string` value type. - // - f["value_size"] += [] (json_value v) -> size_t + f["object_names"] += [] (json_value o) { - // Note: should be consistent with value_traits::empty(), - // json_subscript(). - // - switch (v.type) + names ns; + + if (o.type == json_type::null) + ; + else if (o.type == json_type::object) { - case json_type::null: return 0; - case json_type::boolean: - case json_type::signed_number: - case json_type::unsigned_number: - case json_type::hexadecimal_number: - case json_type::string: break; - case json_type::array: return v.array.size (); - case json_type::object: return v.object.size (); + ns.reserve (o.object.size ()); + + for (json_member& m: o.object) + ns.push_back (name (move (m.name))); } + else + fail << "expected json object instead of " << to_string (o.type); - return 1; + return ns; }; // $array_size() -- cgit v1.1