yao/sui/storages/local/component.go
2023-09-25 14:05:58 +08:00

134 lines
3 KiB
Go

package local
import (
"fmt"
"path/filepath"
"github.com/yaoapp/kun/log"
"github.com/yaoapp/yao/sui/core"
)
// Components get the components
func (tmpl *Template) Components() ([]core.IComponent, error) {
path := filepath.Join(tmpl.Root, "__components")
components := []core.IComponent{}
if exist, _ := tmpl.local.fs.Exists(path); !exist {
return components, nil
}
dirs, err := tmpl.local.fs.ReadDir(path, false)
if err != nil {
return nil, err
}
for _, dir := range dirs {
if !tmpl.local.fs.IsDir(dir) {
continue
}
block, err := tmpl.getComponentFrom(dir)
if err != nil {
log.Error("Get block error: %v", err)
continue
}
components = append(components, block)
}
return components, nil
}
// Component get the component
func (tmpl *Template) Component(id string) (core.IComponent, error) {
path := filepath.Join(tmpl.Root, "__components", id)
if exist, _ := tmpl.local.fs.Exists(path); !exist {
return nil, fmt.Errorf("Block %s not found", id)
}
component, err := tmpl.getComponentFrom(path)
if err != nil {
return nil, err
}
err = component.Load()
if err != nil {
return nil, err
}
_, err = component.Compile()
if err != nil {
return nil, err
}
return component, nil
}
// Load get the component from the storage
func (component *Component) Load() error {
root := filepath.Join(component.tmpl.Root, "__components")
// Type script is the default language
tsFile := filepath.Join(root, component.Codes.TS.File)
if exist, _ := component.tmpl.local.fs.Exists(tsFile); exist {
tsCode, err := component.tmpl.local.fs.ReadFile(tsFile)
if err != nil {
return err
}
component.Codes.TS.Code = string(tsCode)
} else {
jsFile := filepath.Join(root, component.Codes.JS.File)
jsCode, err := component.tmpl.local.fs.ReadFile(jsFile)
if err != nil {
return err
}
component.Codes.JS.Code = string(jsCode)
}
htmlFile := filepath.Join(root, component.Codes.HTML.File)
if exist, _ := component.tmpl.local.fs.Exists(htmlFile); exist {
htmlCode, err := component.tmpl.local.fs.ReadFile(htmlFile)
if err != nil {
return err
}
component.Codes.HTML.Code = string(htmlCode)
}
return nil
}
func (tmpl *Template) getComponentFrom(path string) (core.IComponent, error) {
id := tmpl.getComponentID(path)
return tmpl.getComponent(id)
}
func (tmpl *Template) getComponent(id string) (core.IComponent, error) {
path := filepath.Join(tmpl.Root, "__components", id)
if !tmpl.local.fs.IsDir(path) {
return nil, fmt.Errorf("Component %s not found", id)
}
jsFile := filepath.Join("/", id, fmt.Sprintf("%s.js", id))
tsFile := filepath.Join("/", id, fmt.Sprintf("%s.ts", id))
htmlFile := filepath.Join("/", id, fmt.Sprintf("%s.html", id))
component := &Component{
tmpl: tmpl,
Component: &core.Component{
ID: id,
Codes: core.SourceCodes{
HTML: core.Source{File: htmlFile},
JS: core.Source{File: jsFile},
TS: core.Source{File: tsFile},
},
},
}
return component, nil
}
func (tmpl *Template) getComponentID(path string) string {
return filepath.Base(path)
}