public object? ReadYaml()

in src/Elastic.Markdown/Myst/FrontMatter/ApplicableTo.cs [123:167]


	public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer)
	{
		if (parser.TryConsume<Scalar>(out var value))
		{
			if (string.IsNullOrWhiteSpace(value.Value))
				return ApplicableTo.All;
			if (string.Equals(value.Value, "all", StringComparison.InvariantCultureIgnoreCase))
				return ApplicableTo.All;
		}

		var deserialized = rootDeserializer.Invoke(typeof(Dictionary<object, object?>));
		if (deserialized is not Dictionary<object, object?> { Count: > 0 } dictionary)
			return null;


		var applicableTo = new ApplicableTo();
		var warnings = new List<string>();

		var keys = dictionary.Keys.OfType<string>().ToArray();
		var oldStyleKeys = keys.Where(k => k.StartsWith(':')).ToList();
		if (oldStyleKeys.Count > 0)
			warnings.Add($"Applies block does not use valid yaml keys: {string.Join(", ", oldStyleKeys)}");
		var unknownKeys = keys.Except(KnownKeys).Except(oldStyleKeys).ToList();
		if (unknownKeys.Count > 0)
			warnings.Add($"Applies block does not support the following keys: {string.Join(", ", unknownKeys)}");

		if (TryGetApplicabilityOverTime(dictionary, "stack", out var stackAvailability))
			applicableTo.Stack = stackAvailability;

		if (TryGetApplicabilityOverTime(dictionary, "product", out var productAvailability))
			applicableTo.Product = productAvailability;

		AssignServerless(dictionary, applicableTo);
		AssignDeploymentType(dictionary, applicableTo);

		if (TryGetDeployment(dictionary, out var deployment))
			applicableTo.Deployment = deployment;

		if (TryGetProjectApplicability(dictionary, out var serverless))
			applicableTo.Serverless = serverless;

		if (warnings.Count > 0)
			applicableTo.Warnings = new WarningCollection(warnings);
		return applicableTo;
	}