mycroforge/MicroForge.CLI/Features/Api.cs
2024-04-21 23:56:27 +02:00

64 lines
1.9 KiB
C#

namespace MicroForge.CLI.Features;
public sealed class Api : IFeature
{
#region Main
private static readonly string[] HelloRouter =
[
"from fastapi import APIRouter",
"from fastapi.responses import JSONResponse",
"from fastapi.encoders import jsonable_encoder",
"",
"router = APIRouter()",
"",
"@router.get(\"/{name}\")",
"async def greet(name: str):",
"\treturn JSONResponse(status_code=200, content=jsonable_encoder({'greeting': f\"Hello, {name}!\"}))"
];
private static readonly string[] Main =
[
"from fastapi import FastAPI",
"app = FastAPI()",
"",
"from api.routers import hello",
"app.include_router(prefix=\"/hello\", router=hello.router)"
];
#endregion
public const string FeatureName = "api";
public string Name => FeatureName;
public async Task ExecuteAsync(ProjectContext context)
{
if (context.Config.Features.Contains(FeatureName))
{
Console.WriteLine($"Feature {FeatureName} has already been initialized.");
return;
}
Console.WriteLine(string.Join("\n", [
$"Adding feature {FeatureName}",
"Requirements:",
" - fastapi",
" - uvicorn[standard]",
]));
await Bash.ExecuteAsync(
"source .venv/bin/activate",
"python3 -m pip install fastapi uvicorn[standard]",
"python3 -m pip freeze > requirements.txt"
);
await context.CreateFile("api/routers/hello.py", HelloRouter);
var main = await context.ReadFile("main.py");
main = string.Join('\n', Main) + main;
await context.WriteFile("main.py", main);
context.Config.Features.Add(FeatureName);
}
}