From 174479cc4cbb926bb6fa1d5d443347082af3ed24 Mon Sep 17 00:00:00 2001 From: Kaan Kuscu Date: Wed, 18 Sep 2024 22:42:28 +0300 Subject: [PATCH 1/4] fix entrypoint name validator --- internal/domain/core/service/project/helper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/domain/core/service/project/helper.go b/internal/domain/core/service/project/helper.go index 9baf617..334ea5b 100644 --- a/internal/domain/core/service/project/helper.go +++ b/internal/domain/core/service/project/helper.go @@ -139,7 +139,7 @@ func (*Project) ValidatePkgName(pkgName string) error { var pkgCmdRgx = regexp.MustCompile(`^[a-z][a-z0-9\-]{0,}$`) func (*Project) ValidateEntryPointName(entryPointName string) error { - if !pkgNameRgx.MatchString(entryPointName) { + if !pkgCmdRgx.MatchString(entryPointName) { return dto.ErrInvalidCmdName } return nil From fdd449bde4ef994d5847425ac8fa74fae390ff9b Mon Sep 17 00:00:00 2001 From: Kaan Kuscu Date: Wed, 18 Sep 2024 22:42:58 +0300 Subject: [PATCH 2/4] update lipgloss package version --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index eb0d2f5..db4bf95 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.23 require ( github.com/charmbracelet/huh v0.5.2 - github.com/charmbracelet/lipgloss v0.12.1 + github.com/charmbracelet/lipgloss v0.13.0 github.com/samber/do v1.6.0 github.com/samber/lo v1.47.0 github.com/spf13/cobra v1.8.1 diff --git a/go.sum b/go.sum index 455e851..73c8a0c 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,8 @@ github.com/charmbracelet/huh v0.5.2 h1:ofeNkJ4iaFnzv46Njhx896DzLUe/j0L2QAf8znwzX github.com/charmbracelet/huh v0.5.2/go.mod h1:Sf7dY0oAn6N/e3sXJFtFX9hdQLrUdO3z7AYollG9bAM= github.com/charmbracelet/lipgloss v0.12.1 h1:/gmzszl+pedQpjCOH+wFkZr/N90Snz40J/NR7A0zQcs= github.com/charmbracelet/lipgloss v0.12.1/go.mod h1:V2CiwIuhx9S1S1ZlADfOj9HmxeMAORuz5izHb0zGbB8= +github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw= +github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY= github.com/charmbracelet/x/ansi v0.1.4 h1:IEU3D6+dWwPSgZ6HBH+v6oUuZ/nVawMiWj5831KfiLM= github.com/charmbracelet/x/ansi v0.1.4/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= github.com/charmbracelet/x/exp/strings v0.0.0-20240816142345-245c57877dad h1:Ish95hMV5W/87EXvXA026wt4i/LP+yRkNU+M6ESUrHM= From 1c614a39ac08d21fa3954c45cb96e303dc8dd74e Mon Sep 17 00:00:00 2001 From: Kaan Kuscu Date: Wed, 18 Sep 2024 22:43:20 +0300 Subject: [PATCH 3/4] add tree command --- internal/domain/core/application/cli/cli.go | 4 + .../core/application/cli/treecmd/tree.go | 148 ++++++++++++++++++ main.go | 2 + 3 files changed, 154 insertions(+) create mode 100644 internal/domain/core/application/cli/treecmd/tree.go diff --git a/internal/domain/core/application/cli/cli.go b/internal/domain/core/application/cli/cli.go index a0413d9..d4de02e 100644 --- a/internal/domain/core/application/cli/cli.go +++ b/internal/domain/core/application/cli/cli.go @@ -13,6 +13,7 @@ import ( "github.com/ksckaan1/hexago/internal/domain/core/application/cli/portcmd" "github.com/ksckaan1/hexago/internal/domain/core/application/cli/runnercmd" "github.com/ksckaan1/hexago/internal/domain/core/application/cli/servicecmd" + "github.com/ksckaan1/hexago/internal/domain/core/application/cli/treecmd" "github.com/samber/do" "github.com/spf13/cobra" ) @@ -46,6 +47,7 @@ type CLI struct { packageCreateCmd *packagecmd.PackageCreateCommand runnerCmd *runnercmd.RunnerCommand doctorCmd *doctorcmd.DoctorCommand + treeCmd *treecmd.TreeCommand } func New(i *do.Injector) (*CLI, error) { @@ -74,6 +76,7 @@ func New(i *do.Injector) (*CLI, error) { packageCreateCmd: do.MustInvoke[*packagecmd.PackageCreateCommand](i), runnerCmd: do.MustInvoke[*runnercmd.RunnerCommand](i), doctorCmd: do.MustInvoke[*doctorcmd.DoctorCommand](i), + treeCmd: do.MustInvoke[*treecmd.TreeCommand](i), }, nil } @@ -101,6 +104,7 @@ func (c *CLI) Run(ctx context.Context) error { c.packageCmd.AddCommand(c.packageCreateCmd) c.rootCmd.AddCommand(c.runnerCmd) c.rootCmd.AddCommand(c.doctorCmd) + c.rootCmd.AddCommand(c.treeCmd) err := c.rootCmd.Execute(ctx) if err != nil { diff --git a/internal/domain/core/application/cli/treecmd/tree.go b/internal/domain/core/application/cli/treecmd/tree.go new file mode 100644 index 0000000..1ca2dcb --- /dev/null +++ b/internal/domain/core/application/cli/treecmd/tree.go @@ -0,0 +1,148 @@ +package treecmd + +import ( + "fmt" + + "github.com/charmbracelet/lipgloss" + "github.com/charmbracelet/lipgloss/tree" + "github.com/ksckaan1/hexago/internal/domain/core/port" + "github.com/ksckaan1/hexago/internal/pkg/tuilog" + "github.com/samber/do" + "github.com/samber/lo" + "github.com/spf13/cobra" +) + +type Commander interface { + Command() *cobra.Command +} + +type TreeCommand struct { + cmd *cobra.Command + injector *do.Injector + tuilog *tuilog.TUILog +} + +func NewTreeCommand(i *do.Injector) (*TreeCommand, error) { + return &TreeCommand{ + cmd: &cobra.Command{ + Use: "tree", + Example: "hexago tree", + Short: "Project structure tree", + Long: `Project structure tree`, + }, + injector: i, + }, nil +} + +func (c *TreeCommand) Command() *cobra.Command { + c.init() + return c.cmd +} + +func (c *TreeCommand) AddCommand(cmds ...Commander) { + c.cmd.AddCommand(lo.Map(cmds, func(cmd Commander, _ int) *cobra.Command { + return cmd.Command() + })...) +} + +func (c *TreeCommand) init() { + c.cmd.RunE = c.runner +} + +func (c *TreeCommand) runner(cmd *cobra.Command, _ []string) error { + projectService, err := do.Invoke[port.ProjectService](c.injector) + if err != nil { + return fmt.Errorf("invoke project service: %w", err) + } + + moduleName, err := projectService.GetModuleName("go.mod") + if err != nil { + return fmt.Errorf("project service: get module name: %w", err) + } + + entryPoints, err := projectService.GetAllEntryPoints(cmd.Context()) + if err != nil { + return fmt.Errorf("project service: get all entry points: %w", err) + } + + domains, err := projectService.GetAllDomains(cmd.Context()) + if err != nil { + return fmt.Errorf("project service: get all domains: %w", err) + } + + domainTree := make([]any, len(domains)) + + for i := range domains { + services, err := projectService.GetAllServices(cmd.Context(), domains[i]) + if err != nil { + return fmt.Errorf("project service: get all services: %w", err) + } + + apps, err := projectService.GetAllApplications(cmd.Context(), domains[i]) + if err != nil { + return fmt.Errorf("project service: get all applications: %w", err) + } + + ports, err := projectService.GetAllPorts(cmd.Context(), domains[i]) + if err != nil { + return fmt.Errorf("project service: get all ports: %w", err) + } + + domainTree = append(domainTree, tree.Root(domains[i]).Child( + tree.Root(c.title("Services", len(services))). + Child(c.colorizeElements(services)), + tree.Root(c.title("Applications", len(apps))). + Child(c.colorizeElements(apps)), + tree.Root(c.title("Ports", len(ports))). + Child(c.colorizeElements(ports)), + )) + } + + globalPackages, err := projectService.GetAllPackages(cmd.Context(), true) + if err != nil { + return fmt.Errorf("project service: get all global packages: %w", err) + } + + internalPackages, err := projectService.GetAllPackages(cmd.Context(), false) + if err != nil { + return fmt.Errorf("project service: get all internal packages: %w", err) + } + + infras, err := projectService.GetAllInfrastructes(cmd.Context()) + if err != nil { + return fmt.Errorf("project service: get all infrastructures: %w", err) + } + + treePresentation := tree.Root(fmt.Sprintf("Project (%s)", moduleName)).Child( + tree.Root(c.title("Entry Points", len(entryPoints))). + Child(c.colorizeElements(entryPoints)), + tree.Root(c.title("Domains", len(domains))). + Child(domainTree...), + tree.Root("Infrastructures"). + Child(c.colorizeElements(infras)), + tree.Root(c.title("Packages", len(globalPackages)+len(internalPackages))). + Child( + tree.Root(c.title("Global", len(globalPackages))). + Child(c.colorizeElements(globalPackages)), + tree.Root(c.title("Internal", len(internalPackages))). + Child(c.colorizeElements(internalPackages)), + ), + ).String() + + fmt.Println(treePresentation) + + return nil +} + +func (c *TreeCommand) colorizeElements(elems []string) []string { + renderer := lipgloss.NewStyle().Foreground(lipgloss.Color("#7571F9")) + return lo.Map(elems, func(item string, index int) string { + return renderer.Render(item) + }) +} + +const title = "%s %s" + +func (c *TreeCommand) title(label string, count int) string { + return fmt.Sprintf(title, label, lipgloss.NewStyle().Foreground(lipgloss.Color("#485058")).Render(fmt.Sprintf("(%d)", count))) +} diff --git a/main.go b/main.go index cdacbf9..dfe73e0 100644 --- a/main.go +++ b/main.go @@ -15,6 +15,7 @@ import ( "github.com/ksckaan1/hexago/internal/domain/core/application/cli/portcmd" "github.com/ksckaan1/hexago/internal/domain/core/application/cli/runnercmd" "github.com/ksckaan1/hexago/internal/domain/core/application/cli/servicecmd" + "github.com/ksckaan1/hexago/internal/domain/core/application/cli/treecmd" "github.com/ksckaan1/hexago/internal/domain/core/service/config" projectservice "github.com/ksckaan1/hexago/internal/domain/core/service/project" "github.com/ksckaan1/hexago/internal/pkg/tuilog" @@ -51,6 +52,7 @@ func main() { do.Provide(i, packagecmd.NewPackageCreateCommand) do.Provide(i, runnercmd.NewRunnerCommand) do.Provide(i, doctorcmd.NewDoctorCommand) + do.Provide(i, treecmd.NewTreeCommand) do.Provide(i, projectservice.New) do.Provide(i, config.New) From c155ec3e6abe3b624630fcfb0a625736ba529647 Mon Sep 17 00:00:00 2001 From: Kaan Kuscu Date: Thu, 19 Sep 2024 23:31:02 +0300 Subject: [PATCH 4/4] add infra count --- internal/domain/core/application/cli/treecmd/tree.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/domain/core/application/cli/treecmd/tree.go b/internal/domain/core/application/cli/treecmd/tree.go index 1ca2dcb..ac320d6 100644 --- a/internal/domain/core/application/cli/treecmd/tree.go +++ b/internal/domain/core/application/cli/treecmd/tree.go @@ -118,7 +118,7 @@ func (c *TreeCommand) runner(cmd *cobra.Command, _ []string) error { Child(c.colorizeElements(entryPoints)), tree.Root(c.title("Domains", len(domains))). Child(domainTree...), - tree.Root("Infrastructures"). + tree.Root(c.title("Infrastructures", len(infras))). Child(c.colorizeElements(infras)), tree.Root(c.title("Packages", len(globalPackages)+len(internalPackages))). Child(