| 160 | } |
| 161 | |
| 162 | absl::Status ParseExtensionConfigs(Config& config, absl::string_view yaml, |
| 163 | const YAML::Node& root) { |
| 164 | const YAML::Node extensions = root["extensions"]; |
| 165 | if (!extensions.IsDefined()) { |
| 166 | return absl::OkStatus(); |
| 167 | } |
| 168 | if (!extensions.IsSequence()) { |
| 169 | return YamlError(yaml, extensions, "Node 'extensions' is not a sequence"); |
| 170 | } |
| 171 | |
| 172 | for (const YAML::Node& extension : extensions) { |
| 173 | if (!extension || !extension.IsMap()) { |
| 174 | return YamlError(yaml, extension, "Extension is not a map"); |
| 175 | } |
| 176 | const YAML::Node name = extension["name"]; |
| 177 | if (!name || !name.IsScalar()) { |
| 178 | return YamlError(yaml, name, "Extension name is not a string"); |
| 179 | } |
| 180 | std::string name_str = GetString(yaml, name); |
| 181 | |
| 182 | const YAML::Node version = extension["version"]; |
| 183 | std::string version_str = GetString(yaml, version); |
| 184 | int extension_version; |
| 185 | if (version.IsDefined()) { |
| 186 | bool is_valid_version = false; |
| 187 | if (version.IsScalar()) { |
| 188 | if (version_str == "latest") { |
| 189 | extension_version = Config::ExtensionConfig::kLatest; |
| 190 | is_valid_version = true; |
| 191 | } else { |
| 192 | if (absl::SimpleAtoi(version_str, &extension_version) && |
| 193 | extension_version >= 0) { |
| 194 | is_valid_version = true; |
| 195 | } |
| 196 | } |
| 197 | } |
| 198 | if (!is_valid_version) { |
| 199 | return YamlError( |
| 200 | yaml, version, |
| 201 | absl::StrCat("Extension '", name_str, |
| 202 | "' version is not a valid number or 'latest'")); |
| 203 | } |
| 204 | } else { |
| 205 | extension_version = Config::ExtensionConfig::kLatest; |
| 206 | } |
| 207 | absl::Status add_status = |
| 208 | config.AddExtensionConfig(name_str, extension_version); |
| 209 | if (!add_status.ok()) { |
| 210 | return YamlError(yaml, extension, add_status.message()); |
| 211 | } |
| 212 | } |
| 213 | return absl::OkStatus(); |
| 214 | } |
| 215 | |
| 216 | absl::StatusOr<absl::flat_hash_set<std::string>> ParseMacroList( |
| 217 | absl::string_view yaml, const YAML::Node& standard_library, |
no test coverage detected