-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.go
More file actions
123 lines (106 loc) · 2.81 KB
/
main.go
File metadata and controls
123 lines (106 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package main
import (
"context"
"fmt"
"morethancoder/goat/components"
"os"
"path/filepath"
"strings"
"time"
"github.com/charmbracelet/lipgloss"
"github.com/charmbracelet/log"
)
var (
// Define App Routes & Public Directory
routes = []string{"/", "/examples", "/contact"}
publicDir = "public"
// Logger & Styles
gopherStyle = lipgloss.NewStyle().
Bold(true).
Foreground(lipgloss.Color("#00FFFF"))
goatStyle = lipgloss.NewStyle().
Bold(true).
Foreground(lipgloss.Color("#FFFF00"))
logger = log.NewWithOptions(os.Stderr, log.Options{
ReportCaller: true,
ReportTimestamp: true,
TimeFormat: time.Kitchen,
Prefix: goatStyle.Render("Maa 🐐 "),
})
styles = log.DefaultStyles()
)
func main() {
// Fancy logging
styles.Levels[log.InfoLevel] = lipgloss.NewStyle().Bold(true).
SetString("INFO").
Padding(0, 1, 0, 1).
Background(lipgloss.Color("#00FFFF")).
Foreground(lipgloss.Color("0"))
logger.SetStyles(styles)
// Checking public directory existence
if err := os.MkdirAll(publicDir, 0755); err != nil {
logger.Fatal("Failed to create public directory", "error", err)
}
// Clear the terminal
fmt.Print("\033[H\033[2J")
// Generate HTML for each route
for _, route := range routes {
if err := generateHTML(route); err != nil {
logger.Fatal("Failed to generate HTML", "route", route, "error", err)
}
}
// Clean up obsolete files
if err := cleanUp(); err != nil {
logger.Fatal("Failed to clean up obsolete files", "error", err)
}
}
func generateHTML(route string) error {
filename := "index.html"
if route != "/" {
filename = route[1:] + ".html"
}
filePath := filepath.Join(publicDir, filename)
file, err := os.Create(filePath)
if err != nil {
return fmt.Errorf("failed to create file %s: %w", filePath, err)
}
defer file.Close()
if err := components.App(route).Render(context.Background(), file); err != nil {
return fmt.Errorf("failed to render HTML for route %s: %w", route, err)
}
logger.Infof("Successfully generated file %s", gopherStyle.Render(filePath))
return nil
}
func routeExists(slice []string, item string) bool {
for _, s := range slice {
if s == item {
return true
}
}
return false
}
func cleanUp() error {
files, err := os.ReadDir(publicDir)
if err != nil {
return fmt.Errorf("error reading directory: %w", err)
}
for _, file := range files {
if file.IsDir() {
continue // Skip directories
}
filename := file.Name()
route := "/" + strings.TrimSuffix(filename, ".html")
if filename == "index.html" {
route = "/"
}
if !routeExists(routes, route) {
filePath := filepath.Join(publicDir, filename)
if err := os.Remove(filePath); err != nil {
logger.Error("Failed to remove file", "file", filePath, "error", err)
} else {
logger.Info("Removed obsolete file", "file", filePath)
}
}
}
return nil
}