1313#include " annotations.hpp"
1414
1515namespace rsl {
16+ struct cli ;
1617struct config ;
1718}
1819
@@ -35,11 +36,11 @@ struct Spec {
3536 std::vector<Spec> subcommands;
3637
3738 consteval void parse (std::meta::info r) {
38- // for (auto base : bases_of(r)) {
39- // bases.emplace_back(type_of(base));
40- // }
41-
4239 auto ctx = std::meta::access_context::current ();
40+ for (auto base : bases_of (r, ctx)) {
41+ parse_base (r, base);
42+ }
43+
4344 std::size_t nsdm_idx = bases_of (r, ctx).size ();
4445 for (auto member : members_of (r, ctx)) {
4546 if (!has_identifier (member) || !is_public (member)) {
@@ -53,19 +54,21 @@ struct Spec {
5354 }
5455 }
5556
56- consteval void parse_base (std::meta::info r) {
57- if (extract<bool >(substitute (^^std::derived_from, {dealias (r), ^^config}))) {
58- for (auto fnc_template : members_of (^^config, std::meta::access_context::current ()) |
59- std::views::filter (std::meta::is_function_template)) {
60- if (!can_substitute (fnc_template, {r})) {
57+ consteval void parse_base (std::meta::info self, std::meta::info r) {
58+ if (extract<bool >(substitute (^^std::convertible_to, {type_of (r), ^^config}))) {
59+ // special case built-in bases. These need to access the child type
60+
61+ for (auto fnc_template : members_of (type_of (r), std::meta::access_context::current ())) {
62+ if (!is_function_template (fnc_template) || !can_substitute (fnc_template, {self})) {
6163 continue ;
6264 }
6365
64- auto fnc = substitute (fnc_template, {r });
66+ auto fnc = substitute (fnc_template, {self });
6567 if (meta::has_annotation<annotations::Option>(fnc)) {
6668 commands.emplace_back (identifier_of (fnc_template), fnc);
6769 }
6870 }
71+ bases.push_back ({});
6972 }
7073 }
7174
@@ -150,7 +153,7 @@ struct Spec {
150153 };
151154
152155 rsl::string_view name;
153- rsl::span<rsl::span<Argument const >> bases;
156+ rsl::span<rsl::span<Argument const > const > bases;
154157 rsl::span<Argument const > arguments;
155158 rsl::span<Option const > commands;
156159 rsl::span<Option const > options;
@@ -159,9 +162,14 @@ struct Spec {
159162 auto type = is_type (r) ? r : type_of (r);
160163 auto parser = Parser ();
161164 parser.parse (type);
162- parser.parse_base (type);
165+ // parser.parse_base(type);
163166 parser.validate ();
164- // bases = define_static_array(parser.bases);
167+ std::vector<rsl::span<Argument const >> meta_bases;
168+ for (auto base : parser.bases ) {
169+ meta_bases.push_back (rsl::span (define_static_array (base)));
170+ }
171+
172+ bases = define_static_array (meta_bases);
165173 arguments = define_static_array (parser.arguments );
166174 commands = define_static_array (parser.commands );
167175 options = define_static_array (parser.options );
0 commit comments