23public class HumanReadableAliasEventEmitter : ChainedEventEmitter
25 private readonly Dictionary<string, string> _anchorRenames =
new Dictionary<string, string>();
26 private readonly Dictionary<string, int> _typeCounters =
new Dictionary<string, int>();
28 public HumanReadableAliasEventEmitter(IEventEmitter nextEmitter) : base(nextEmitter) { }
30 public override void Emit(MappingStartEventInfo eventInfo, IEmitter emitter)
32 if (!eventInfo.Anchor.IsEmpty)
33 eventInfo.Anchor =
new AnchorName(Rename(eventInfo.Anchor.Value, eventInfo.Source.Type?.Name));
34 base.Emit(eventInfo, emitter);
37 public override void Emit(SequenceStartEventInfo eventInfo, IEmitter emitter)
39 if (!eventInfo.Anchor.IsEmpty)
40 eventInfo.Anchor =
new AnchorName(Rename(eventInfo.Anchor.Value, eventInfo.Source.Type?.Name));
41 base.Emit(eventInfo, emitter);
44 public override void Emit(AliasEventInfo eventInfo, IEmitter emitter)
46 if (_anchorRenames.TryGetValue(eventInfo.Alias.Value, out var readable))
47 emitter.Emit(
new AnchorAlias(
new AnchorName(readable)));
49 base.Emit(eventInfo, emitter);
52 private string Rename(
string original,
string typeName)
54 var clean = CleanTypeName(typeName);
55 _typeCounters.TryGetValue(clean, out
int count);
56 _typeCounters[clean] = count + 1;
57 var readable = count == 0 ? clean : $
"{clean}_{count + 1}";
58 _anchorRenames[original] = readable;
62 private static string CleanTypeName(
string name)
64 if (name ==
null)
return "object";
65 var backtick = name.IndexOf(
'`');
66 return backtick >= 0 ? name.Substring(0, backtick) : name;