lux

command module
v3.3.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 27, 2024 License: MIT Imports: 11 Imported by: 0

README

Lux

╔╗   ╔╗ ╔╗╔═╗╔═╗
║║   ║║ ║║╚╗╚╝╔╝
║║   ║║ ║║ ╚╗╔╝ 
║║ ╔╗║║ ║║ ╔╝╚╗ 
║╚═╝║║╚═╝║╔╝╔╗╚╗
╚═══╝╚═══╝╚═╝╚═╝
                
                

Lux is a web framework for the Go programming language. It's designed to be convienent and easy to use, while still being fast runtime performance.

Installation

CLI Tool

To install the CLI tool, run the following command:

go install github.com/snowmerak/lux/v3@latest
Library
go get github.com/snowmerak/lux/v3

Usage

Simple Example
  1. Create a new project
go mod init myproject
  1. Add lux to your project
go get github.com/snowmerak/lux/v3
  1. Generate and edit sample api
lux g c -g api/index

This will generate a new controller in the api group called index.
And edit Route in metadata.controller.go.

// api/index/metadata.controller.go
package index

const (
	Route = "/index"
)

The below is the generated controller.

// api/index/get.controller.go
package index

import (
	"github.com/snowmerak/lux/v3/context"
	"github.com/snowmerak/lux/v3/controller"
	"github.com/snowmerak/lux/v3/lux"
	"github.com/snowmerak/lux/v3/middleware"
)

type GetController struct{
	requestMiddlewares []middleware.Request
	responseMiddlewares []middleware.Response
	handler controller.RestHandler
}

func NewGetController() *GetController {
	return &GetController{
		requestMiddlewares: []middleware.Request{},
		responseMiddlewares: []middleware.Response{},
		handler: func(lc *context.LuxContext) error {
			// Write your handler here
			return lc.ReplyString("Hello, World!")
		},
	}
}

func RegisterGetController(c *GetController, l *lux.Lux) {
	l.AddRestController(Route, controller.GET, controller.RestController{
		RequestMiddlewares: c.requestMiddlewares,
		Handler: c.handler,
		ResponseMiddlewares: c.responseMiddlewares,
	})
}
  1. Generate entrypoint
lux g e server

This will generate a new entrypoint called server.

  1. Register API to entrypoint
// server/main.go
package main

import (
	"context"
	"log"
	"playground/api/echo"
	"playground/api/index"
	"playground/client/redis"

	"github.com/snowmerak/lux/v3/lux"
	"github.com/snowmerak/lux/v3/provider"
)

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	constructors := []any{
		lux.New,
		lux.GenerateListenAddress(":8080"),

		index.NewGetController,
	}

	updaters := []any{
		index.RegisterGetController,
	}

	p := provider.New()
	if err := p.Register(constructors...); err != nil {

		log.Fatal(err)
	}

	if err := p.Construct(ctx); err != nil {
		log.Fatal(err)
	}

	if err := provider.Update(p, updaters...); err != nil {
		log.Fatal(err)
	}

	if err := provider.JustRun(p, lux.ListenAndServe1); err != nil {
		log.Fatal(err)
	}

	<-ctx.Done()
}
  1. Run the server
go run server/main.go
With Service
  1. Generate and edit service
lux g s client/redis 

This will generate a new service in the client group called redis.
And add Get method to RedisService in service.go.

// client/redis/service.go
package redis

type RedisService struct{}

func NewService() *RedisService {
	return &RedisService{}
}

// Added method
func (r *RedisService) Get() string {
	return "Hello, Redis!"
}
  1. Register service to entrypoint

Service should be registered before controller.
You can use service in any controller via dependency injection.

// server/main.go
package main

import (
	"context"
	"log"
	"playground/api/echo"
	"playground/api/index"
	"playground/client/redis"

	"github.com/snowmerak/lux/v3/lux"
	"github.com/snowmerak/lux/v3/provider"
)

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	constructors := []any{
		lux.New,
		lux.GenerateListenAddress(":8080"),

		index.NewGetController,

		redis.NewService,
	}

	updaters := []any{
		index.RegisterGetController,
	}

	p := provider.New()
	if err := p.Register(constructors...); err != nil {

		log.Fatal(err)
	}

	if err := p.Construct(ctx); err != nil {
		log.Fatal(err)
	}

	if err := provider.Update(p, updaters...); err != nil {
		log.Fatal(err)
	}

	if err := provider.JustRun(p, lux.ListenAndServe1); err != nil {
		log.Fatal(err)
	}

	<-ctx.Done()
}
  1. Use service in controller
// api/index/get.controller.go
package index

import (
	"playground/client/redis"

	"github.com/snowmerak/lux/v3/context"
	"github.com/snowmerak/lux/v3/controller"
	"github.com/snowmerak/lux/v3/lux"
	"github.com/snowmerak/lux/v3/middleware"
)

type GetController struct {
	requestMiddlewares  []middleware.Request
	responseMiddlewares []middleware.Response
	handler             controller.RestHandler
}

func NewGetController(redisService *redis.RedisService) *GetController {
	return &GetController{
		requestMiddlewares:  []middleware.Request{},
		responseMiddlewares: []middleware.Response{},
		handler: func(lc *context.LuxContext) error {
			message := redisService.Get()
			return lc.ReplyString(message)
		},
	}
}

func RegisterGetController(c *GetController, l *lux.Lux) {
	l.AddRestController(Route, controller.GET, controller.RestController{
		RequestMiddlewares:  c.requestMiddlewares,
		Handler:             c.handler,
		ResponseMiddlewares: c.responseMiddlewares,
	})
}
  1. Run the server
go run server/main.go

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL