using System.CommandLine; using Humanizer; using MycroForge.CLI.CodeGen; using MycroForge.CLI.Commands.Interfaces; namespace MycroForge.CLI.Commands; public partial class MycroForge { public partial class Orm { public partial class Generate { public class Entity : Command, ISubCommandOf { private static readonly string[] Template = [ "from sqlalchemy import String", "from sqlalchemy.orm import Mapped, mapped_column", "from orm.entities.entity_base import EntityBase", "", "class %class_name%(EntityBase):", "\t__tablename__ = \"%table_name%\"", "\tid: Mapped[int] = mapped_column(primary_key=True)", "\tvalue: Mapped[str] = mapped_column(String(255))", "", "\tdef __repr__(self) -> str:", "\t\treturn f\"%class_name%(id={self.id!r}, value={self.value!r})\"" ]; private static readonly Argument NameArgument = new(name: "name", description: "The name of the orm entity"); private readonly ProjectContext _context; public Entity(ProjectContext context) : base("entity", "Generate and orm entity") { _context = context; AddAlias("e"); AddArgument(NameArgument); this.SetHandler(ExecuteAsync, NameArgument); } private async Task ExecuteAsync(string name) { var className = name.Underscore().Pascalize(); var moduleName = name.Underscore(); var code = string.Join('\n', Template); code = code.Replace("%class_name%", className); code = code.Replace("%table_name%", name.Underscore().ToLower()); await _context.CreateFile($"orm/entities/{moduleName}.py", code); var env = await _context.ReadFile("orm/env.py"); env = new OrmEnvUpdater(env, moduleName, className).Rewrite(); await _context.WriteFile("orm/env.py", env); } } } } }