summaryrefslogtreecommitdiff
path: root/NW4RTools/Logger.cs
blob: a6fbb700f6c42b3d55dd1a0adb32e4209e7e8644 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
using System;
using System.Collections.Generic;
using System.Text;

namespace NW4RTools {
	public class LogContext : IDisposable {
		// An awful, awful hack
		private readonly ILogger Owner;

		public LogContext(ILogger owner) {
			Owner = owner;
		}

		void IDisposable.Dispose() {
			Owner.Pop();
		}
	}

	public interface ILogger {
		void Send(string format, params object[] args);
		LogContext Push(string format, params object[] args);
		void Pop();
		void Block();
		void Unblock();
	}

	public class ConsoleLogger : ILogger {
		private List<string> PrefixElements;
		private List<string> Names;
		private int BlockCount;
		private string Prefix;

		public ConsoleLogger() {
			Names = new List<string>();
			Names.Add("root");

			PrefixElements = new List<string>();
			PrefixElements.Add("|");

			RebuildPrefix();
		}

		private void RebuildPrefix() {
			Prefix = string.Join("  ", PrefixElements.ToArray()) + "- ";
		}

		public void Send(string format, params object[] args) {
			if (BlockCount > 0)
				return;

			Console.Write(Prefix);
			Console.WriteLine(format, args);
		}

		public LogContext Push(string format, params object[] args) {
			string n = string.Format(format, args);
			Console.Write(Prefix);
			Console.Write("=== ");
			Console.WriteLine(n);

			Names.Add(n);

			PrefixElements.Add("-");
			RebuildPrefix();

			return new LogContext(this);
		}

		public void Pop() {
			PrefixElements.RemoveAt(PrefixElements.Count - 1);
			RebuildPrefix();

			string n = Names[Names.Count - 1];
			Names.RemoveAt(Names.Count - 1);
			Console.Write(Prefix);
			Console.Write("=/= end ");
			Console.WriteLine(n);
		}

		public void Block() {
			BlockCount += 1;
		}

		public void Unblock() {
			BlockCount -= 1;
		}
	}
}