@@ -150,12 +150,72 @@ absl::Status ParseName(Config& config, absl::string_view yaml,
150150absl::Status ParseContainerConfig (Config& config, absl::string_view yaml,
151151 const YAML::Node& root) {
152152 const YAML::Node container = root[" container" ];
153- if (container.IsDefined ()) {
154- if (!container.IsScalar ()) {
155- return YamlError (yaml, container, " Node 'container' is not a string" );
156- }
153+ if (!container.IsDefined ()) {
154+ return absl::OkStatus ();
155+ }
156+
157+ if (container.IsScalar ()) {
157158 config.SetContainerConfig ({.name = GetString (yaml, container)});
159+ return absl::OkStatus ();
158160 }
161+
162+ if (!container.IsMap ()) {
163+ return YamlError (yaml, container,
164+ " Node 'container' is neither a string nor a map" );
165+ }
166+
167+ Config::ContainerConfig container_config;
168+
169+ const YAML::Node name = container[" name" ];
170+ if (name.IsDefined ()) {
171+ if (!name.IsScalar ()) {
172+ return YamlError (yaml, name, " Node 'name' in container is not a string" );
173+ }
174+ container_config.name = GetString (yaml, name);
175+ }
176+
177+ const YAML::Node abbreviations = container[" abbreviations" ];
178+ if (abbreviations.IsDefined ()) {
179+ if (!abbreviations.IsSequence ()) {
180+ return YamlError (yaml, abbreviations,
181+ " Node 'abbreviations' is not a sequence" );
182+ }
183+ for (const YAML::Node& abbr : abbreviations) {
184+ if (!abbr.IsScalar ()) {
185+ return YamlError (yaml, abbr, " Abbreviation is not a string" );
186+ }
187+ container_config.abbreviations .push_back (GetString (yaml, abbr));
188+ }
189+ }
190+
191+ const YAML::Node aliases = container[" aliases" ];
192+ if (aliases.IsDefined ()) {
193+ if (!aliases.IsSequence ()) {
194+ return YamlError (yaml, aliases, " Node 'aliases' is not a sequence" );
195+ }
196+ for (const YAML::Node& alias_node : aliases) {
197+ if (!alias_node.IsMap ()) {
198+ return YamlError (yaml, alias_node, " Alias entry is not a map" );
199+ }
200+ const YAML::Node alias_key = alias_node[" alias" ];
201+ const YAML::Node qualified_name_key = alias_node[" qualified_name" ];
202+
203+ if (!alias_key.IsDefined () || !alias_key.IsScalar ()) {
204+ return YamlError (yaml, alias_node,
205+ " Alias entry missing 'alias' string" );
206+ }
207+ if (!qualified_name_key.IsDefined () || !qualified_name_key.IsScalar ()) {
208+ return YamlError (yaml, alias_node,
209+ " Alias entry missing 'qualified_name' string" );
210+ }
211+
212+ container_config.aliases .push_back (
213+ {.alias = GetString (yaml, alias_key),
214+ .qualified_name = GetString (yaml, qualified_name_key)});
215+ }
216+ }
217+
218+ config.SetContainerConfig (std::move (container_config));
159219 return absl::OkStatus ();
160220}
161221
@@ -686,7 +746,44 @@ void EmitContainerConfig(const Config& env_config, YAML::Emitter& out) {
686746 }
687747
688748 out << YAML::Key << " container" ;
689- out << YAML::Value << YAML::DoubleQuoted << container_config.name ;
749+ if (container_config.abbreviations .empty () &&
750+ container_config.aliases .empty ()) {
751+ out << YAML::Value << YAML::DoubleQuoted << container_config.name ;
752+ } else {
753+ out << YAML::Value << YAML::BeginMap;
754+ if (!container_config.name .empty ()) {
755+ out << YAML::Key << " name" << YAML::Value << YAML::DoubleQuoted
756+ << container_config.name ;
757+ }
758+ if (!container_config.abbreviations .empty ()) {
759+ std::vector<std::string> sorted_abbrs = container_config.abbreviations ;
760+ absl::c_sort (sorted_abbrs);
761+ out << YAML::Key << " abbreviations" << YAML::Value << YAML::BeginSeq;
762+ for (const auto & abbr : sorted_abbrs) {
763+ out << YAML::Value << YAML::DoubleQuoted << abbr;
764+ }
765+ out << YAML::EndSeq;
766+ }
767+ if (!container_config.aliases .empty ()) {
768+ std::vector<Config::ContainerConfig::Alias> sorted_aliases =
769+ container_config.aliases ;
770+ absl::c_sort (sorted_aliases, [](const Config::ContainerConfig::Alias& a,
771+ const Config::ContainerConfig::Alias& b) {
772+ return a.alias < b.alias ;
773+ });
774+ out << YAML::Key << " aliases" << YAML::Value << YAML::BeginSeq;
775+ for (const auto & alias : sorted_aliases) {
776+ out << YAML::BeginMap;
777+ out << YAML::Key << " alias" << YAML::Value << YAML::DoubleQuoted
778+ << alias.alias ;
779+ out << YAML::Key << " qualified_name" << YAML::Value
780+ << YAML::DoubleQuoted << alias.qualified_name ;
781+ out << YAML::EndMap;
782+ }
783+ out << YAML::EndSeq;
784+ }
785+ out << YAML::EndMap;
786+ }
690787}
691788
692789void EmitExtensionConfigs (const Config& env_config, YAML::Emitter& out) {
0 commit comments