diff --git a/Minime.sln b/Minime.sln
index fb9f792..889298e 100644
--- a/Minime.sln
+++ b/Minime.sln
@@ -11,6 +11,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{9DA99E16-F
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nyanbyte.Minime.Test", "test\Nyanbyte.Minime.Test\Nyanbyte.Minime.Test.csproj", "{1E4D89E6-A38C-4E68-9DA2-BF931190696C}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nyanbyte.Minime.Cli", "src\Nyanbyte.Minime.Cli\Nyanbyte.Minime.Cli.csproj", "{79FC08D0-6965-4CA9-9E0E-A8E2A9B5D5F5}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -28,9 +30,14 @@ Global
{1E4D89E6-A38C-4E68-9DA2-BF931190696C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1E4D89E6-A38C-4E68-9DA2-BF931190696C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1E4D89E6-A38C-4E68-9DA2-BF931190696C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {79FC08D0-6965-4CA9-9E0E-A8E2A9B5D5F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {79FC08D0-6965-4CA9-9E0E-A8E2A9B5D5F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {79FC08D0-6965-4CA9-9E0E-A8E2A9B5D5F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {79FC08D0-6965-4CA9-9E0E-A8E2A9B5D5F5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{96F040B9-C9C9-4B1E-ABB5-39DA51BEB00C} = {EEBF5124-1862-4105-B6AB-A9B578B0CA3D}
{1E4D89E6-A38C-4E68-9DA2-BF931190696C} = {9DA99E16-F65C-466B-9FB3-C59D9E1B31AC}
+ {79FC08D0-6965-4CA9-9E0E-A8E2A9B5D5F5} = {EEBF5124-1862-4105-B6AB-A9B578B0CA3D}
EndGlobalSection
EndGlobal
diff --git a/src/Nyanbyte.Minime.Cli/Nyanbyte.Minime.Cli.csproj b/src/Nyanbyte.Minime.Cli/Nyanbyte.Minime.Cli.csproj
new file mode 100644
index 0000000..66e1a72
--- /dev/null
+++ b/src/Nyanbyte.Minime.Cli/Nyanbyte.Minime.Cli.csproj
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/src/Nyanbyte.Minime.Cli/Program.cs b/src/Nyanbyte.Minime.Cli/Program.cs
new file mode 100644
index 0000000..2dc138b
--- /dev/null
+++ b/src/Nyanbyte.Minime.Cli/Program.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.Build.Locator;
+
+namespace Nyanbyte.Minime.Cli;
+
+public class Program
+{
+ public static async Task Main(string[] args)
+ {
+ MSBuildLocator.RegisterDefaults();
+ await Execute();
+ }
+
+ public static async Task Execute()
+ {
+ RuntimeManager runtime = new(RuntimeOptions.Default);
+ await runtime.ExecutePlain();
+ }
+}
diff --git a/src/Nyanbyte.Minime/Bundling/BundlingContext.cs b/src/Nyanbyte.Minime/Bundling/BundlingContext.cs
new file mode 100644
index 0000000..5a34dce
--- /dev/null
+++ b/src/Nyanbyte.Minime/Bundling/BundlingContext.cs
@@ -0,0 +1,7 @@
+namespace Nyanbyte.Minime.Bundling;
+
+public class BundlingContext
+{
+ public StreamWriter Output { get; internal set; } = null!;
+ public StreamReader Input { get; internal set; } = null!;
+}
diff --git a/src/Nyanbyte.Minime/Bundling/IBundler.cs b/src/Nyanbyte.Minime/Bundling/IBundler.cs
new file mode 100644
index 0000000..b714c35
--- /dev/null
+++ b/src/Nyanbyte.Minime/Bundling/IBundler.cs
@@ -0,0 +1,6 @@
+namespace Nyanbyte.Minime.Bundling;
+
+public interface IBundler
+{
+ public Task Bundle(BundlingContext ctx, CancellationToken cancellation);
+}
diff --git a/src/Nyanbyte.Minime/Minime.cs b/src/Nyanbyte.Minime/Minime.cs
deleted file mode 100644
index 3428317..0000000
--- a/src/Nyanbyte.Minime/Minime.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-
-namespace Nyanbyte.Minime;
-
-public class Minime
-{
-
-}
diff --git a/src/Nyanbyte.Minime/MinimeBuildTask.cs b/src/Nyanbyte.Minime/MinimeBuildTask.cs
index dd10f93..b07d543 100644
--- a/src/Nyanbyte.Minime/MinimeBuildTask.cs
+++ b/src/Nyanbyte.Minime/MinimeBuildTask.cs
@@ -1,12 +1,14 @@
-using Microsoft.Build.Utilities;
-
namespace Nyanbyte.Minime;
public class MinimeBuildTask : Microsoft.Build.Utilities.Task
{
public override bool Execute()
{
- Log.LogMessage("meow");
+ System.Threading.Tasks.Task.Run(async () =>
+ {
+ RuntimeManager runtime = new(RuntimeOptions.Default);
+ await runtime.Execute(this.BuildEngine);
+ }).Wait();
return true;
}
}
diff --git a/src/Nyanbyte.Minime/Processing/CssProcessor.cs b/src/Nyanbyte.Minime/Processing/CssProcessor.cs
index 9a2e9fd..6df1742 100644
--- a/src/Nyanbyte.Minime/Processing/CssProcessor.cs
+++ b/src/Nyanbyte.Minime/Processing/CssProcessor.cs
@@ -1,8 +1,4 @@
-using System;
using System.Buffers;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
namespace Nyanbyte.Minime.Processing;
@@ -16,7 +12,9 @@ public class CssProcessor : IProcessor
L_STRING_C = '\'',
L_SEMI = ';';
- public async Task Execute(FileContext ctx, CancellationToken cancellation)
+ public string[] AcceptedExtensions => new[] { "css" };
+
+ public async Task Process(ProcessingContext ctx, CancellationToken cancellation)
{
var write = ctx.Output;
var read = ctx.Input;
diff --git a/src/Nyanbyte.Minime/Processing/IProcessor.cs b/src/Nyanbyte.Minime/Processing/IProcessor.cs
index cced1ef..2c91a6d 100644
--- a/src/Nyanbyte.Minime/Processing/IProcessor.cs
+++ b/src/Nyanbyte.Minime/Processing/IProcessor.cs
@@ -1,11 +1,7 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-
namespace Nyanbyte.Minime.Processing;
public interface IProcessor
{
- public Task Execute(FileContext ctx, CancellationToken cancellation);
+ public string[] AcceptedExtensions { get; }
+ public Task Process(ProcessingContext ctx, CancellationToken cancellation);
}
diff --git a/src/Nyanbyte.Minime/Processing/FileContext.cs b/src/Nyanbyte.Minime/Processing/ProcessingContext.cs
similarity index 61%
rename from src/Nyanbyte.Minime/Processing/FileContext.cs
rename to src/Nyanbyte.Minime/Processing/ProcessingContext.cs
index 90bf120..67e8658 100644
--- a/src/Nyanbyte.Minime/Processing/FileContext.cs
+++ b/src/Nyanbyte.Minime/Processing/ProcessingContext.cs
@@ -1,15 +1,11 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
using Microsoft.Build.Framework;
namespace Nyanbyte.Minime.Processing;
-public class FileContext
+public class ProcessingContext
{
public required string Path { get; init; }
- public required IBuildEngine BuildEngine { get; init; }
+ public IBuildEngine? BuildEngine { get; init; }
public string? OutputPath { get; set; }
public StreamWriter Output { get; internal set; } = null!;
public StreamReader Input { get; internal set; } = null!;
diff --git a/src/Nyanbyte.Minime/Processing/ProcessingOptions.cs b/src/Nyanbyte.Minime/Processing/ProcessingOptions.cs
new file mode 100644
index 0000000..611556a
--- /dev/null
+++ b/src/Nyanbyte.Minime/Processing/ProcessingOptions.cs
@@ -0,0 +1,6 @@
+namespace Nyanbyte.Minime.Processing;
+
+public class ProcessingOptions
+{
+
+}
diff --git a/src/Nyanbyte.Minime/RuntimeManager.cs b/src/Nyanbyte.Minime/RuntimeManager.cs
new file mode 100644
index 0000000..469c091
--- /dev/null
+++ b/src/Nyanbyte.Minime/RuntimeManager.cs
@@ -0,0 +1,57 @@
+using System.Reflection;
+using Microsoft.Build.Framework;
+using Nyanbyte.Minime.Processing;
+
+namespace Nyanbyte.Minime;
+
+public class RuntimeManager
+{
+ public RuntimeManager(RuntimeOptions options)
+ {
+ _options = options;
+
+ Init();
+ }
+
+ private readonly RuntimeOptions _options;
+
+ private Dictionary _processors = null!;
+
+ private void Init()
+ {
+ _processors = Assembly.GetExecutingAssembly().GetTypes()
+ .Where(t => t.IsAssignableFrom(typeof(IProcessor)) && t.IsClass).Select(t => (IProcessor)Activator.CreateInstance(t)!).SelectMany(m => m.AcceptedExtensions.Select(e => KeyValuePair.Create(e, m))).ToDictionary(k => k.Key, k => k.Value);
+ }
+
+ public async Task ExecutePlain(CancellationToken cancellation = default)
+ {
+ await Execute(default, cancellation);
+ }
+
+ public async Task Execute(IBuildEngine? buildEngine = default, CancellationToken cancellation = default)
+ {
+ Init();
+
+ HashSet files = new();
+ foreach (string f in _options.SearchDirectories)
+ {
+ files.UnionWith(Directory.GetFiles(f, "*", _options.DeepSearch ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly));
+ }
+
+ foreach (string file in files)
+ {
+ if (_processors.TryGetValue(Path.GetExtension(file), out var processor))
+ {
+ using StreamReader reader = new(File.OpenRead(file));
+ ProcessingContext ctx = new()
+ {
+ Path = file,
+ BuildEngine = buildEngine,
+ Input = reader
+ };
+
+ await processor.Process(ctx, cancellation);
+ }
+ }
+ }
+}
diff --git a/src/Nyanbyte.Minime/RuntimeOptions.cs b/src/Nyanbyte.Minime/RuntimeOptions.cs
new file mode 100644
index 0000000..e097c87
--- /dev/null
+++ b/src/Nyanbyte.Minime/RuntimeOptions.cs
@@ -0,0 +1,13 @@
+namespace Nyanbyte.Minime;
+
+public record RuntimeOptions
+{
+ public static RuntimeOptions Default => new()
+ {
+ DeepSearch = true,
+ SearchDirectories = new[] { Environment.CurrentDirectory }
+ };
+
+ public bool DeepSearch { get; init; }
+ public string[] SearchDirectories { get; init; } = null!;
+}
diff --git a/test/Nyanbyte.Minime.Test/Processor/CssProcessorTests.cs b/test/Nyanbyte.Minime.Test/Processor/CssProcessorTests.cs
index 380579b..8e6cafc 100644
--- a/test/Nyanbyte.Minime.Test/Processor/CssProcessorTests.cs
+++ b/test/Nyanbyte.Minime.Test/Processor/CssProcessorTests.cs
@@ -1,9 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using Xunit;
-
namespace Nyanbyte.Minime.Test.Processor;
public class CssProcessorTests