status-im/status-go

View on GitHub
images/color.go

Summary

Maintainability
A
0 mins
Test Coverage
C
72%
package images

import (
    "fmt"
    "image/color"
    "strconv"
    "strings"
)

func ParseColor(colorStr string) (color.RGBA, error) {
    var c color.RGBA

    if strings.HasPrefix(colorStr, "#") {
        // Parse hex color string
        // Remove "#" prefix
        colorStr = colorStr[1:]

        // Convert to RGBA
        val, err := strconv.ParseUint(colorStr, 16, 32)
        if err != nil {
            return c, err
        }
        c.R = uint8(val >> 16)
        c.G = uint8(val >> 8)
        c.B = uint8(val)
        c.A = 255
    } else if strings.HasPrefix(colorStr, "rgb(") {
        // Parse RGB color string
        // Remove prefix and suffix
        colorStr = strings.TrimSuffix(strings.TrimPrefix(colorStr, "rgb("), ")")

        // Split the string into comma separated parts
        parts := strings.Split(colorStr, ",")
        if len(parts) != 3 {
            return c, fmt.Errorf("invalid RGB color string")
        }

        // Convert to RGBA
        r, err := strconv.Atoi(strings.TrimSpace(parts[0]))
        if err != nil {
            return c, err
        }
        g, err := strconv.Atoi(strings.TrimSpace(parts[1]))
        if err != nil {
            return c, err
        }
        b, err := strconv.Atoi(strings.TrimSpace(parts[2]))
        if err != nil {
            return c, err
        }
        c.R = uint8(r)
        c.G = uint8(g)
        c.B = uint8(b)
        c.A = 255
    } else if strings.HasPrefix(colorStr, "rgba(") {
        // Parse RGBA color string
        // Remove prefix and suffix
        colorStr = strings.TrimSuffix(strings.TrimPrefix(colorStr, "rgba("), ")")

        // Split the string into comma separated parts
        parts := strings.Split(colorStr, ",")
        if len(parts) != 4 {
            return c, fmt.Errorf("invalid RGBA color string")
        }

        // Convert to RGBA
        r, err := strconv.Atoi(strings.TrimSpace(parts[0]))
        if err != nil {
            return c, err
        }
        g, err := strconv.Atoi(strings.TrimSpace(parts[1]))
        if err != nil {
            return c, err
        }
        b, err := strconv.Atoi(strings.TrimSpace(parts[2]))
        if err != nil {
            return c, err
        }
        a, err := strconv.ParseFloat(strings.TrimSpace(parts[3]), 64)
        if err != nil {
            return c, err
        }
        if a < 0 || a > 1 {
            return c, fmt.Errorf("invalid RGBA alpha value")
        }
        c.R = uint8(r)
        c.G = uint8(g)
        c.B = uint8(b)
        c.A = uint8(a * 255)
    } else {
        return c, fmt.Errorf("invalid color string format")
    }

    return c, nil
}