summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob McDonnell <jacob@jacobmcdonnell.com>2026-04-26 16:52:03 -0400
committerJacob McDonnell <jacob@jacobmcdonnell.com>2026-04-26 16:52:03 -0400
commitee64cdc2712a8e7f77c6af02385afd43a2a1e61b (patch)
tree8baf3e9ffba5522c901fc04dd118ba25697a1e35
parent97d5c458cfa039d857301e1ca7d5af3beb37131d (diff)
refactor: Split Go code into multiple files
-rw-r--r--allowed.go48
-rw-r--r--db.go92
-rw-r--r--main.go128
-rw-r--r--sql.go.example46
4 files changed, 143 insertions, 171 deletions
diff --git a/allowed.go b/allowed.go
new file mode 100644
index 00000000..e6789206
--- /dev/null
+++ b/allowed.go
@@ -0,0 +1,48 @@
+package main
+
+import (
+ "fmt"
+ "html/template"
+ "log"
+ "net/http"
+ "os"
+ "regexp"
+ "slices"
+)
+
+type AllowedFiles struct {
+ allowedFiles []string
+}
+
+func (a *AllowedFiles) GetFiles(w http.ResponseWriter, r *http.Request) {
+ log.Println("Request for:", r.URL.String())
+ url := fmt.Sprintf("static%s", r.URL.String())
+ htmlRegex, err := regexp.Compile("^static/.*\\.html$")
+ if err != nil {
+ ErrorPage(w, 500)
+ return
+ }
+
+ if url == "static/" {
+ url = "static/index.html"
+ }
+
+ if !slices.Contains(a.allowedFiles, url) {
+ ErrorPage(w, 404)
+ return
+ }
+
+ if htmlRegex.MatchString(url) {
+ t := template.Must(template.ParseFiles("templates/template.html"))
+
+ html, err := os.ReadFile(url)
+ if err != nil {
+ ErrorPage(w, 500)
+ return
+ }
+
+ t.Execute(w, template.HTML(html))
+ } else {
+ http.ServeFile(w, r, url)
+ }
+}
diff --git a/db.go b/db.go
new file mode 100644
index 00000000..49e7656a
--- /dev/null
+++ b/db.go
@@ -0,0 +1,92 @@
+package main
+
+import (
+ "database/sql"
+ "fmt"
+ "log"
+ _ "modernc.org/sqlite"
+ "net/http"
+ "os"
+)
+
+type Database struct {
+ DB *sql.DB
+}
+
+type Entry struct {
+ os string
+ name string
+ section int
+ path string
+}
+
+func (d *Database) GetOS(w http.ResponseWriter, r *http.Request) {
+ rows, err := d.DB.Query("SELECT DISTINCT os FROM manpages;")
+ if err != nil {
+ log.Println(err)
+ ErrorPage(w, 500)
+ return
+ }
+ defer rows.Close()
+
+ for rows.Next() {
+ var osName string
+
+ if err := rows.Scan(&osName); err != nil {
+ log.Println(err)
+ ErrorPage(w, 500)
+ return
+ }
+
+ fmt.Fprintf(w, "<option value=\"%s\">%s</option>", osName, osName)
+ }
+}
+
+func (d *Database) Search(w http.ResponseWriter, r *http.Request) {
+ query := r.URL.Query()
+
+ log.Println("Request for:", r.URL.String())
+
+ name := query["name"][0]
+ section := query["section"][0]
+ osName := query["os"][0]
+
+ log.Println(name)
+
+ rows, err := d.DB.Query("SELECT * FROM manpages WHERE name == ? AND section == ? AND os == ?;", name, section, osName)
+ if err != nil {
+ log.Println(err)
+ ErrorPage(w, 500)
+ return
+ }
+ defer rows.Close()
+
+ var entries []Entry
+ for rows.Next() {
+ var entry Entry
+
+ if err := rows.Scan(&entry.os, &entry.name, &entry.section, &entry.path); err != nil {
+ log.Println(err)
+ ErrorPage(w, 500)
+ return
+ }
+
+ entries = append(entries, entry)
+ }
+
+ if len(entries) > 0 {
+ fmt.Fprintf(w, "<hr>")
+ for _, e := range entries {
+ data, err := os.ReadFile(e.path)
+ if err != nil {
+ log.Println(err)
+ ErrorPage(w, 500)
+ return
+ }
+ fmt.Fprintf(w, "%s", data)
+ }
+ fmt.Fprintf(w, "<hr>")
+ } else {
+ fmt.Fprintf(w, "<center><h1>No results found for %s %s(%s)</h1></center>", osName, name, section)
+ }
+}
diff --git a/main.go b/main.go
index b8a49198..69897f4c 100644
--- a/main.go
+++ b/main.go
@@ -1,136 +1,14 @@
package main
import (
+ "database/sql"
"fmt"
"html/template"
"log"
"net/http"
"os"
- "slices"
- "regexp"
- "database/sql"
- _ "modernc.org/sqlite"
)
-type Entry struct {
- os string
- name string
- section int
- path string
-}
-
-type Database struct {
- DB *sql.DB
-}
-
-func (d *Database) GetOS(w http.ResponseWriter, r *http.Request) {
- rows, err := d.DB.Query("SELECT DISTINCT os FROM manpages;")
- if err != nil {
- log.Println(err)
- ErrorPage(w, 500)
- return
- }
- defer rows.Close()
-
- for rows.Next() {
- var osName string
-
- if err := rows.Scan(&osName); err != nil {
- log.Println(err)
- ErrorPage(w, 500)
- return
- }
-
- fmt.Fprintf(w, "<option value=\"%s\">%s</option>", osName, osName)
- }
-}
-
-func (d *Database) Search(w http.ResponseWriter, r *http.Request) {
- query := r.URL.Query()
-
- log.Println("Request for:", r.URL.String())
-
- name := query["name"][0]
- section := query["section"][0]
- osName := query["os"][0]
-
- log.Println(name)
-
- rows, err := d.DB.Query("SELECT * FROM manpages WHERE name == ? AND section == ? AND os == ?;", name, section, osName)
- if err != nil {
- log.Println(err)
- ErrorPage(w, 500)
- return
- }
- defer rows.Close()
-
- var entries []Entry
- for rows.Next() {
- var entry Entry
-
- if err := rows.Scan(&entry.os, &entry.name, &entry.section, &entry.path); err != nil {
- log.Println(err)
- ErrorPage(w, 500)
- return
- }
-
- entries = append(entries, entry)
- }
-
- if len(entries) > 0 {
- fmt.Fprintf(w, "<hr>")
- for _, e := range entries {
- data, err := os.ReadFile(e.path)
- if err != nil {
- log.Println(err)
- ErrorPage(w, 500)
- return
- }
- fmt.Fprintf(w, "%s", data)
- }
- fmt.Fprintf(w, "<hr>")
- } else {
- fmt.Fprintf(w, "<center><h1>No results found for %s %s(%s)</h1></center>", osName, name, section)
- }
-}
-
-type AllowedFiles struct {
- allowedFiles []string
-}
-
-func (a *AllowedFiles) GetFiles(w http.ResponseWriter, r *http.Request) {
- log.Println("Request for:", r.URL.String())
- url := fmt.Sprintf("static%s", r.URL.String())
- htmlRegex, err := regexp.Compile("^static/.*\\.html$")
- if err != nil {
- ErrorPage(w, 500)
- return
- }
-
- if url == "static/" {
- url = "static/index.html"
- }
-
- if !slices.Contains(a.allowedFiles, url) {
- ErrorPage(w, 404)
- return
- }
-
- if htmlRegex.MatchString(url) {
- t := template.Must(template.ParseFiles("templates/template.html"))
-
- html, err := os.ReadFile(url)
- if err != nil {
- ErrorPage(w, 500)
- return
- }
-
- t.Execute(w, template.HTML(html))
- } else {
- http.ServeFile(w, r, url)
- }
-}
-
func ErrorPage(w http.ResponseWriter, code int) {
log.Println(code, http.StatusText(code))
t := template.Must(template.ParseFiles("templates/error.html"))
@@ -174,8 +52,8 @@ func main() {
log.Fatal(err)
}
- dbWrapper := &Database{ DB: db }
- allowed := &AllowedFiles {
+ dbWrapper := &Database{DB: db}
+ allowed := &AllowedFiles{
allowedFiles: []string{
"static/htmx.min.js",
"static/index.html",
diff --git a/sql.go.example b/sql.go.example
deleted file mode 100644
index af73c7ad..00000000
--- a/sql.go.example
+++ /dev/null
@@ -1,46 +0,0 @@
-package main
-
-import (
- "database/sql"
- _ "modernc.org/sqlite"
- "fmt"
- "log"
- _ "modernc.org/sqlite"
-)
-
-type Entry struct {
- os string
- name string
- section int
- path string
-}
-
-func main() {
- db, err := sql.Open("sqlite", "man.db")
- if err != nil {
- log.Fatal(err)
- }
-
- if err := db.Ping(); err != nil {
- log.Fatal(err)
- }
-
- r, err := db.Query("SELECT * FROM manpages WHERE name == 'intro';")
- if err != nil {
- log.Fatal(err)
- }
- defer r.Close()
-
- for r.Next() {
- var entry Entry
- if err := r.Scan(&entry.os, &entry.name, &entry.section, &entry.path); err != nil {
- log.Fatal(err)
- }
- fmt.Println(entry.os, entry.name, entry.section, entry.path)
- }
-
- err = db.Close()
- if err != nil {
- log.Fatal(err)
- }
-}