package furcadia import ( "fmt" "strings" "unicode" ) /////////////////////////////////////////////////////////////////////////////////////////////////// // FUNCTIONS ////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// // GetShortName returns a "shortname" derived from a given Furcadia display name func GetShortName(displayName string) string { sb := &strings.Builder{} for _, r := range displayName { if unicode.IsLetter(r) || unicode.IsNumber(r) { sb.WriteRune(unicode.ToLower(r)) } } return sb.String() } // GetShortDreamURL converts a regular "furc://uploader:name/" dream url into // a "short" form that can be used as a hash key (e.g., "uploader:name"). // // ErrInvalidDreamURL is returned if the given url is not a valid dream URL. func GetShortDreamURL(url string) (string, error) { // cut prefix u, found := strings.CutPrefix(strings.ToLower(url), "furc://") if !found { return "", ErrInvalidDreamURL } // cut suffix u = strings.SplitN(u, "/", 2)[0] // split uploader name and dream name var uploaderName string var dreamName string elements := strings.Split(u, ":") switch len(elements) { case 0: panic(fmt.Sprintf("len(%v) == 0", elements)) case 1: uploaderName = elements[0] dreamName = "" case 2: uploaderName = elements[0] dreamName = elements[1] default: return "", ErrInvalidDreamURL } short := GetShortDreamURLFromName(uploaderName, dreamName) if short == "" || short[0] == ':' { // furc:// // furc:/// // furc://:/ // furc://:something/ return "", ErrInvalidDreamURL } return short, nil } func GetShortDreamURLFromName(uploaderName, dreamName string) (short string) { shortName := GetShortName(uploaderName) shortDream := GetShortName(dreamName) if shortDream == "" { short = shortName } else { short = shortName + ":" + shortDream } return }