| File: Yaml\IntOrStringConverter.cs | Web Access |
| Project: src\src\Aspire.Hosting.Kubernetes\Aspire.Hosting.Kubernetes.csproj (Aspire.Hosting.Kubernetes) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Aspire.Hosting.Kubernetes.Resources; using YamlDotNet.Core; using YamlDotNet.Serialization; namespace Aspire.Hosting.Kubernetes.Yaml; /// <summary> /// Provides a custom YAML type converter that facilitates serialization /// and deserialization of objects of type <see cref="Int32OrStringV1"/>. /// This converter supports both integers and strings. /// </summary> public class IntOrStringYamlConverter : IYamlTypeConverter { /// <summary> /// Determines whether the given type is supported by this YAML type converter. /// </summary> /// <param name="type">The type to check for compatibility with the YAML converter.</param> /// <returns>Returns true if the specified type is <see cref="Int32OrStringV1"/>, otherwise false.</returns> public bool Accepts(Type type) { return type == typeof(Int32OrStringV1); } /// <summary> /// Reads a YAML scalar from the parser and converts it into an instance of <see cref="Int32OrStringV1"/>. /// </summary> /// <param name="parser">The YAML parser to read the scalar value from.</param> /// <param name="type">The target type for deserialization, expected to be <see cref="Int32OrStringV1"/>.</param> /// <param name="rootDeserializer">The root deserializer used for handling nested deserialization.</param> /// <returns>Returns an instance of <see cref="Int32OrStringV1"/> constructed from the parsed scalar value.</returns> /// <exception cref="InvalidOperationException">Thrown if the current YAML event is not a scalar.</exception> public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) { if (parser.Current is not YamlDotNet.Core.Events.Scalar scalar) { throw new InvalidOperationException(parser.Current?.ToString()); } var value = scalar.Value; parser.MoveNext(); return string.IsNullOrEmpty(value) ? null : new Int32OrStringV1(value); } /// <summary> /// Writes the given object to the provided YAML emitter using the appropriate format. /// </summary> /// <param name="emitter">The emitter used to write the YAML output.</param> /// <param name="value">The object to be serialized. Expected to be of type <see cref="Int32OrStringV1"/>.</param> /// <param name="type">The type of the object being serialized.</param> /// <param name="serializer">The serializer to be used for complex object serialization.</param> /// <exception cref="InvalidOperationException">Thrown when the provided value is not of type <see cref="Int32OrStringV1"/>.</exception> public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) { if (value is not Int32OrStringV1 obj) { throw new InvalidOperationException($"Expected {nameof(Int32OrStringV1)} but got {value?.GetType()}"); } if (obj.Number != null) { serializer(obj.Number); } else { var val = obj.Value ?? string.Empty; serializer(val); } } }