diff --git a/backend/colour.go b/backend/colour.go new file mode 100644 index 0000000..0886ad4 --- /dev/null +++ b/backend/colour.go @@ -0,0 +1,30 @@ +package main + +import ( + "errors" + "fmt" +) + +func ConvertStringToColour(colourStr string) (int, error) { + if len(colourStr) == 0 { + return 0xFF0000, nil // Default colour if no string is provided + } + if colourStr[0] == '#' { + colourStr = colourStr[1:] + } + if len(colourStr) != 6 && len(colourStr) != 3 { + return 0, errors.New("colour must be a valid hex string") + } + var colour int + _, err := fmt.Sscanf(colourStr, "%x", &colour) + if err != nil { + return 0, fmt.Errorf("invalid colour format: %v", err) + } + if len(colourStr) == 3 { + r := (colour & 0xF00) >> 8 + g := (colour & 0x0F0) >> 4 + b := (colour & 0x00F) >> 0 + colour = (r << 16 << 4) | (g << 8 << 4) | (b << 0 << 4) + } + return colour, nil +} diff --git a/backend/colour_test.go b/backend/colour_test.go new file mode 100644 index 0000000..812e8bc --- /dev/null +++ b/backend/colour_test.go @@ -0,0 +1,30 @@ +package main + +import ( + "github.com/stretchr/testify/require" + "testing" +) + +func TestConvertStringToColourWithSign(t *testing.T) { + colour, err := ConvertStringToColour("#123456") + require.NoError(t, err) + require.Equal(t, 0x123456, colour) +} + +func TestConvertStringToColourWithoutSign(t *testing.T) { + colour, err := ConvertStringToColour("123456") + require.NoError(t, err) + require.Equal(t, 0x123456, colour) +} + +func TestConvertStringToColourWithSignThreeDigits(t *testing.T) { + colour, err := ConvertStringToColour("#ABC") + require.NoError(t, err) + require.Equal(t, 0xA0B0C0, colour) +} + +func TestConvertStringToColourWithoutSignThreeDigits(t *testing.T) { + colour, err := ConvertStringToColour("ABC") + require.NoError(t, err) + require.Equal(t, 0xA0B0C0, colour) +} diff --git a/backend/db.go b/backend/db.go index 0c58a85..151594d 100644 --- a/backend/db.go +++ b/backend/db.go @@ -127,23 +127,6 @@ func (db *Db) GetUserAllowanceById(userId int, allowanceId int) (*Allowance, err return allowance, nil } -func ConvertStringToColour(colourStr string) (int, error) { - if len(colourStr) == 0 { - return 0xFF0000, nil // Default colour if no string is provided - } - if colourStr[0] == '#' { - colourStr = colourStr[1:] - } - if len(colourStr) != 6 && len(colourStr) != 3 { - return 0, errors.New("colour must be a valid hex string") - } - colour, err := fmt.Sscanf(colourStr, "%x", &colourStr) - if err != nil { - return 0, fmt.Errorf("invalid colour format: %v", err) - } - return colour, nil -} - func (db *Db) CreateAllowance(userId int, allowance *CreateAllowanceRequest) (int, error) { // Check if user exists before attempting to create an allowance exists, err := db.UserExists(userId) @@ -287,7 +270,7 @@ func (db *Db) UpdateAllowance(userId int, allowanceId int, allowance *UpdateAllo target := int(math.Round(allowance.Target * 100.0)) err = tx.Query("update allowances set name=?, target=?, weight=?, colour=? where id = ? and user_id = ?"). - Bind(allowance.Name, target, allowance.Weight, allowanceId, userId, colour). + Bind(allowance.Name, target, allowance.Weight, colour, allowanceId, userId). Exec() if err != nil { return err