Skip to content

Commit

Permalink
Merge pull request #1 from ksckaan1/add-tree-command
Browse files Browse the repository at this point in the history
Add tree command
  • Loading branch information
ksckaan1 authored Sep 19, 2024
2 parents 840771c + c155ec3 commit f96bd54
Show file tree
Hide file tree
Showing 6 changed files with 158 additions and 2 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down
4 changes: 4 additions & 0 deletions internal/domain/core/application/cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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 {
Expand Down
148 changes: 148 additions & 0 deletions internal/domain/core/application/cli/treecmd/tree.go
Original file line number Diff line number Diff line change
@@ -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(c.title("Infrastructures", len(infras))).
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)))
}
2 changes: 1 addition & 1 deletion internal/domain/core/service/project/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit f96bd54

Please sign in to comment.