Files
gemini-grs/gemini/gemini_url.go

85 lines
1.9 KiB
Go

package gemini
import (
"database/sql/driver"
"fmt"
"net/url"
"strconv"
)
type URL struct {
Protocol string `json:"protocol,omitempty"`
Hostname string `json:"hostname,omitempty"`
Port int `json:"port,omitempty"`
Path string `json:"path,omitempty"`
Descr string `json:"descr,omitempty"`
Full string `json:"full,omitempty"`
}
func (u *URL) Scan(value interface{}) error {
if value == nil {
// Clear the fields in the current GeminiUrl object (not the pointer itself)
*u = URL{}
return nil
}
b, ok := value.(string)
if !ok {
return fmt.Errorf("failed to scan GeminiUrl: expected string, got %T", value)
}
parsedURL, err := ParseURL(b, "")
if err != nil {
return err
}
*u = *parsedURL
return nil
}
func (u *URL) String() string {
return u.Full
}
// Value implements the driver.Valuer interface
func (u URL) Value() (driver.Value, error) {
if u.Full == "" {
return nil, nil
}
return u.Full, nil
}
func ParseURL(input string, descr string) (*URL, error) {
u, err := url.Parse(input)
if err != nil {
return nil, fmt.Errorf("%w: Input %s Error %w", ErrURLParse, input, err)
}
protocol := u.Scheme
hostname := u.Hostname()
strPort := u.Port()
path := u.Path
if strPort == "" {
strPort = "1965"
}
port, err := strconv.Atoi(strPort)
if err != nil {
return nil, fmt.Errorf("%w: Input %s Error %w", ErrURLParse, input, err)
}
return &URL{Protocol: protocol, Hostname: hostname, Port: port, Path: path, Descr: descr, Full: u.String()}, nil
}
//func GeminiUrltoJSON(g URL) string {
// // Serialize the Person struct to JSON
// jsonData, err := json.Marshal(g)
// if err != nil {
// logging.LogError("Error serializing to JSON: %w", err)
// }
// return string(jsonData)
//}
//
//func GeminiUrlFromJSON(input string) URL {
// var geminiUrl URL
// err := json.Unmarshal([]byte(input), &geminiUrl)
// if err != nil {
// logging.LogError("Error deserializing from JSON: %w", err)
// }
// return geminiUrl
//}