framework de desarrollo fullstack en go,
Define una estructura de datos una vez y genera automáticamente formularios HTML, API HTTP y consultas SQL.
con soporte a webAssembly y tinygo.
package main
este proyecto se creo con el objetivo en mente y realizando la pregunta: como puedo crea una aplicación web de pila completa escribiendo el menor código posible.
json de la librería estándar y gorm usan reflect y eso si lo llevamos a un dispositivo de bajo rendimiento se vuelve lento, si a eso le sumamos que queremos compilar a tinygo (que es la única forma de reducir el tamaño del binario resultante para webAssembly) necesitamos que el resultado sea optimo, sin dependencias externas y soporte a webAssembly + tinygo.
si lo usa pero una sola vez es como un json con asteroides. crea una imagen de cada estructura de tu programa cuando este arranca y lo mantiene en memoria para que no tenga que ser generado en tiempo de ejecución.
es un proyecto grande si, llevo trabando en el desde el 2020 pero con librerías separadas. ahora con todo lo aprendido es el momento de unir todo.
- [] renderizado de formularios html
solo se trabajara con almacenamiento del tipo texto que es el que todas las base de datos soportan, por ende la validación de datos se hará en el lado del servidor y el front con go + webAssembly. asi se evita configuraciones interminables en las estructuras de datos.
- Generación de json
- UI: renderizados de formularios html
- NT: http y red
- DB: base de datos
- G: funciones globales (tool, helpers, utils)
- D: diccionario de palabras traducidas o mensajes de error para usar con R.T() o R.Err()
- R: reply crear respuestas, métodos: Err() error, T() string. ej: R.Err(D.Field,D.NotFound), R.T(D.Address)
- Inputs: inicializares de inputs eg: Text(), Number(),Radio(), Checkbox(), Select(), File()
según input agregado en la etiqueta
- si el campo no contiene el atributo Input se le asigna un input de tipo text a todo tipo de dato excepto si es numérico como int, uint etc.
type Person struct {
Id string `Legend:"Id Persona"`
other uint
Name string `Legend:"Nombre" Input:"Text()"`
Age uint8 `Input:"Number(min=0;max=120)"`
}
- tipos de inputs soportados en ..mono/inputs eg:
- si el o los inputs que necesitas no se encuentra en la librería puedes crear el método asociado a tu estructura de esta forma:
type input interface {
Render(tabIndex *int) string
Validate(value string) error
}
type Person struct {
Name string `Legend:"Nombre" Input:"NewInputText()"`
}
func (p *Person) Inputs() []input {
return p.myInputs
}
un crear uno nuevo y agregarlo a la librería.
-
params support with = eg:
Input:"Radio(options=m:male,f:female)"
: min,max,maxlength,class,placeholder,title,autocomplete,rows,cols,step,oninput,onkeyup,onchange,accept,multiple,value,options -
y si necesito que la data del input sea dinámica? ej:
Input:"List(dynamic)"
el nombre de la función debe ser igual al nombre del campo ej:functionName(id string) []map[string]string
-
name se asigna de forma automática según el nombre del campo ej:
Age uint8 = name=age
-
dataset eg:
Input:"Text(data=price:100,dto:15%)"
html:<input type="text" data-price="100" data-dto="15%">
-
!required (campo no obligatorio) eg:
Input:"Text(!required)"
por defecto todos los campos son obligatorios. -
hidden (campo oculto) eg:
Input:"Text(hidden)"
-
!required (campo no obligatorio) ej:
Input:"Text(!required)"
por defecto todos los campos son obligatorios. -
typing=hide (ocultar el campo cuando se escribe eg: password) ej:
Input:"Text(typing=hide)"
-
letters (letras permitidas) ej:
Input:"Text(letters)"
-
numbers (números permitidos) ej:
Input:"Text(numbers)"
-
chars (caracteres permitidos) ej :
Input:"Text(chars=':','-','+',' ')"
- para combinar separar con ; ej:
Input:"Text(data=price:100;!required letters;numbers)"
si quieres participar en el proyecto puedes contactarme con un mensaje privado
Si encuentras útil este proyecto y te gustaría apoyarlo, puedes hacer una donación aquí con paypal
Cualquier contribución, por pequeña que sea, es muy apreciada. 🙌