Quoted non-string values remain quoted after serialization (#442)
* add failing test for environment variable and annotation yaml serialization * simplify the test case * initial tests passing with StringQuotingEmitter * cleanup * expand test * add attribution * run dotnet format
This commit is contained in:
52
src/KubernetesClient/StringQuotingEmitter.cs
Normal file
52
src/KubernetesClient/StringQuotingEmitter.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
using YamlDotNet.Core;
|
||||
using YamlDotNet.Serialization;
|
||||
using YamlDotNet.Serialization.EventEmitters;
|
||||
|
||||
namespace k8s
|
||||
{
|
||||
// adapted from https://github.com/cloudbase/powershell-yaml/blob/master/powershell-yaml.psm1
|
||||
public class StringQuotingEmitter : ChainedEventEmitter
|
||||
{
|
||||
// Patterns from https://yaml.org/spec/1.2/spec.html#id2804356
|
||||
private static readonly Regex quotedRegex =
|
||||
new Regex(@"^(\~|null|true|false|-?(0|[1-9][0-9]*)(\.[0-9]*)?([eE][-+]?[0-9]+)?)?$");
|
||||
|
||||
public StringQuotingEmitter(IEventEmitter next) : base(next)
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Emit(ScalarEventInfo eventInfo, IEmitter emitter)
|
||||
{
|
||||
var typeCode = eventInfo.Source.Value != null
|
||||
? Type.GetTypeCode(eventInfo.Source.Type)
|
||||
: TypeCode.Empty;
|
||||
switch (typeCode)
|
||||
{
|
||||
case TypeCode.Char:
|
||||
if (char.IsDigit((char)eventInfo.Source.Value))
|
||||
{
|
||||
eventInfo.Style = ScalarStyle.DoubleQuoted;
|
||||
}
|
||||
|
||||
break;
|
||||
case TypeCode.String:
|
||||
var val = eventInfo.Source.Value.ToString();
|
||||
if (quotedRegex.IsMatch(val))
|
||||
{
|
||||
eventInfo.Style = ScalarStyle.DoubleQuoted;
|
||||
}
|
||||
else if (val.IndexOf('\n') > -1)
|
||||
{
|
||||
eventInfo.Style = ScalarStyle.Literal;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
base.Emit(eventInfo, emitter);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user