} fr_dict_attr_err_t;
typedef bool (*fr_dict_attr_valid_func_t)(fr_dict_attr_t *da);
+typedef bool (*fr_dict_attr_type_parse_t)(fr_type_t *type, fr_dict_attr_flags_t *flags, char const *name);
/*
* Forward declarations to avoid circular references.
///< Called when comparing attributes by their fields.
} flags;
+ fr_dict_attr_type_parse_t type_parse; //!< parse unknown type names
fr_dict_attr_valid_func_t valid; //!< Validation function to ensure that
///< new attributes are valid.
} attr;
*/
type = fr_type_from_str(name);
if (fr_type_is_null(type)) {
- fr_strerror_printf("Unknown data type '%s'", name);
- return -1;
+ fr_dict_attr_t *da = *da_p;
+
+ if (!da->dict->proto->attr.type_parse) {
+ fr_strerror_printf("Unknown data type '%s'", name);
+ return -1;
+ }
+
+ if (!da->dict->proto->attr.type_parse(&type, &da->flags, name)) {
+ return -1;
+ }
}
return dict_attr_type_init(da_p, type);