terminal/src/tools/ColorTool/ColorTool/Program.cs
2019-04-30 12:27:06 -07:00

151 lines
4.7 KiB
C#

//
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the terms described in the LICENSE file in the root of this project.
//
using ColorTool.ConsoleTargets;
using ColorTool.SchemeWriters;
using System;
using System.Collections.Generic;
using System.Linq;
namespace ColorTool
{
static class Program
{
private static bool quietMode = false;
private static bool reportErrors = false;
private static bool setDefaults = false;
private static bool setProperties = true;
private static bool setUnixStyle = false;
public static void Main(string[] args)
{
if (args.Length < 1)
{
Usage();
return;
}
for (int i = 0; i < args.Length; i++)
{
string arg = args[i];
switch (arg)
{
case "-c":
case "--current":
ColorTable.PrintTable();
return;
case "-e":
case "--errors":
reportErrors = true;
break;
case "-q":
case "--quiet":
quietMode = true;
break;
case "-d":
case "--defaults":
setDefaults = true;
setProperties = false;
break;
case "-b":
case "--both":
setDefaults = true;
setProperties = true;
break;
case "-?":
case "--help":
Usage();
return;
case "-v":
case "--version":
Version();
return;
case "-l":
case "--location":
SchemeManager.PrintSchemesDirectory();
return;
case "-x":
case "--xterm":
setUnixStyle = true;
setProperties = true;
break;
case "-o":
case "--output":
if (i + 1 < args.Length)
{
new IniSchemeWriter().ExportCurrentAsIni(args[i + 1]);
}
else
{
OutputUsage();
}
return;
case "-s":
case "--schemes":
SchemeManager.PrintSchemes();
return;
default:
break;
}
}
string schemeName = args[args.Length - 1];
ColorScheme colorScheme = SchemeManager.GetScheme(schemeName, reportErrors);
if (colorScheme == null)
{
Console.WriteLine(string.Format(Resources.SchemeNotFound, schemeName));
return;
}
foreach (var target in GetConsoleTargets())
{
target.ApplyColorScheme(colorScheme, quietMode);
}
}
private static void Usage()
{
Console.WriteLine(Resources.Usage,
string.Join($"{Environment.NewLine} ", SchemeManager.GetParsers().Select(p => p.Name)));
}
private static void OutputUsage()
{
Console.WriteLine(Resources.OutputUsage);
}
private static void Version()
{
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var info = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
Console.WriteLine($"colortool v{info.FileVersion}");
}
/// <summary>
/// Returns an enumerable of consoles that we want to apply the colorscheme to.
/// The contents of this enumerable depends on the user's provided command line flags.
/// </summary>
private static IEnumerable<IConsoleTarget> GetConsoleTargets()
{
if (setDefaults)
{
yield return new DefaultConsoleTarget();
}
if (setProperties)
{
if (setUnixStyle)
{
yield return new VirtualTerminalConsoleTarget();
}
else
{
yield return new CurrentConsoleTarget();
}
}
}
}
}