From 8b341d2ac66acd386e9d22cc8ea718d6df648cff Mon Sep 17 00:00:00 2001 From: antanst Date: Mon, 11 Nov 2024 16:14:58 +0200 Subject: [PATCH] refactor: Simplify URL parsing and remove JSON-related methods --- gemini/gemini_url.go | 61 +++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/gemini/gemini_url.go b/gemini/gemini_url.go index 1c29302..29b4bb5 100644 --- a/gemini/gemini_url.go +++ b/gemini/gemini_url.go @@ -1,12 +1,12 @@ package gemini import ( - "encoding/json" "fmt" - "gemini-grc/logging" + "net/url" + "strconv" ) -type GeminiUrl struct { +type URL struct { Protocol string `json:"protocol,omitempty"` Hostname string `json:"hostname,omitempty"` Port int `json:"port,omitempty"` @@ -15,43 +15,62 @@ type GeminiUrl struct { Full string `json:"full,omitempty"` } -func (g *GeminiUrl) Scan(value interface{}) error { +func (u *URL) Scan(value interface{}) error { if value == nil { // Clear the fields in the current GeminiUrl object (not the pointer itself) - *g = GeminiUrl{} + *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, "") + parsedURL, err := ParseURL(b, "") if err != nil { return err } - *g = *parsedUrl + *u = *parsedURL return nil } -func (u GeminiUrl) String() string { +func (u *URL) String() string { return u.Full // return fmt.Sprintf("%s://%s:%d%s", u.Protocol, u.Hostname, u.Port, u.Path) } -func GeminiUrltoJSON(g GeminiUrl) string { - // Serialize the Person struct to JSON - jsonData, err := json.Marshal(g) +func ParseURL(input string, descr string) (*URL, error) { + u, err := url.Parse(input) if err != nil { - logging.LogError("Error serializing to JSON: %w", err) + return nil, fmt.Errorf("%w: Input %s Error %w", ErrURLParse, input, err) } - return string(jsonData) + 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 GeminiUrlFromJSON(input string) GeminiUrl { - var geminiUrl GeminiUrl - err := json.Unmarshal([]byte(input), &geminiUrl) - if err != nil { - logging.LogError("Error deserializing from JSON: %w", err) - } - return geminiUrl -} +//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 +//}