/mono

MonoGo framework de desarrollo fullstack en go, Define una estructura de datos una vez y genera automáticamente formularios HTML, API HTTP y consultas SQL.

Primary LanguageGoMIT LicenseMIT

MONO

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.

  • ! ADVERTENCIA API EN DESARROLLO !

ejemplo

package main

Motivación

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.

por que no solo unir json gorm?

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.

mono no usa reflect?

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.

alcances:

html (gui)

  • [] renderizado de formularios html

base de datos

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.

json

  • Generación de json

APIS:

  • 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()

html rendering and validation

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)"

Participar

si quieres participar en el proyecto puedes contactarme con un mensaje privado

Apóyame

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. 🙌