nikoksr/proji

View on GitHub
pkg/package/service/util.go

Summary

Maintainability
A
0 mins
Test Coverage
package packageservice

import (
    "fmt"
    "regexp"
    "strings"
    "unicode"

    "github.com/nikoksr/proji/pkg/domain"
)

func isPackageValid(pkg *domain.Package) error {
    if len(pkg.Name) == 0 {
        return fmt.Errorf("package needs a name")
    }
    if len(pkg.Label) == 0 {
        return fmt.Errorf("package needs a label")
    }
    if len(pkg.Templates) == 0 && len(pkg.Plugins) == 0 {
        return fmt.Errorf("package has no data")
    }
    return nil
}

// pickLabel dynamically picks a label based on the package name.
func pickLabel(packageName string) string {
    nameLen := len(packageName)
    if nameLen < 2 {
        return strings.ToLower(packageName)
    }

    label := ""
    maxLabelLen := 4

    // Try to create label by separators
    // labelSeparators defines a list of rues that are used to split package names and transform them to labels.
    // '%20' is for escaped paths.
    labelSeparators := []string{"-", "_", ".", " ", "%20"}
    parts := make([]string, 0)
    for _, d := range labelSeparators {
        parts = strings.Split(packageName, d)
        if len(parts) > 1 {
            break
        }
    }

    if len(parts) > 1 {
        for i, part := range parts {
            if i > maxLabelLen {
                break
            }
            label += string(part[0])
        }
        return strings.ToLower(label)
    }

    // Try to create label by uppercase letters
    if !unicode.IsUpper(rune(packageName[0])) {
        packageName = string(byte(unicode.ToUpper(rune(packageName[0])))) + packageName[1:]
    }

    re := regexp.MustCompile(`[A-Z][^A-Z]*`)
    parts = re.FindAllString(packageName, -1)

    if len(parts) > 1 {
        for i, part := range parts {
            if i > maxLabelLen {
                break
            }
            label += string(part[0])
        }
        return strings.ToLower(label)
    }

    // Pick first, mid and last byte in string
    label = string(packageName[0]) + string(packageName[nameLen/2]) + string(packageName[nameLen-1])
    return strings.ToLower(label)
}