aboutsummaryrefslogtreecommitdiff
path: root/backend/internal/database/stocks.go
diff options
context:
space:
mode:
authorGravatar Anshul Gupta <ansg191@anshulg.com> 2024-08-07 19:48:19 -0700
committerGravatar Anshul Gupta <ansg191@anshulg.com> 2024-08-07 19:48:52 -0700
commita439618cdc8168bad617d04875697b572f3ed41d (patch)
treeb6d867a2d65713deb2e8c2daa25a9df2dd23308b /backend/internal/database/stocks.go
parent55231eb4cfb5b5ce246a68ef456619cdb65d8af1 (diff)
downloadibd-trader-a439618cdc8168bad617d04875697b572f3ed41d.tar.gz
ibd-trader-a439618cdc8168bad617d04875697b572f3ed41d.tar.zst
ibd-trader-a439618cdc8168bad617d04875697b572f3ed41d.zip
Rewrite `LetterRating` to match protobuf def
Also changes DB schema to accept strings instead of integers.
Diffstat (limited to 'backend/internal/database/stocks.go')
-rw-r--r--backend/internal/database/stocks.go108
1 files changed, 55 insertions, 53 deletions
diff --git a/backend/internal/database/stocks.go b/backend/internal/database/stocks.go
index 865aec4..0627a72 100644
--- a/backend/internal/database/stocks.go
+++ b/backend/internal/database/stocks.go
@@ -3,9 +3,10 @@ package database
import (
"context"
"database/sql"
+ "database/sql/driver"
"errors"
- "fmt"
+ pb "github.com/ansg191/ibd-trader-backend/api/gen/idb/stock/v1"
"github.com/ansg191/ibd-trader-backend/internal/analyzer"
"github.com/ansg191/ibd-trader-backend/internal/utils"
@@ -193,93 +194,94 @@ type Ratings struct {
AccDis LetterRating
}
-type LetterRating uint8
-
-const (
- LetterRatingE LetterRating = iota
- LetterRatingEPlus
- LetterRatingDMinus
- LetterRatingD
- LetterRatingDPlus
- LetterRatingCMinus
- LetterRatingC
- LetterRatingCPlus
- LetterRatingBMinus
- LetterRatingB
- LetterRatingBPlus
- LetterRatingAMinus
- LetterRatingA
- LetterRatingAPlus
-)
+type LetterRating pb.LetterGrade
func (r LetterRating) String() string {
- switch r {
- case LetterRatingE:
+ switch pb.LetterGrade(r) {
+ case pb.LetterGrade_LETTER_GRADE_E:
return "E"
- case LetterRatingEPlus:
+ case pb.LetterGrade_LETTER_GRADE_E_PLUS:
return "E+"
- case LetterRatingDMinus:
+ case pb.LetterGrade_LETTER_GRADE_D_MINUS:
return "D-"
- case LetterRatingD:
+ case pb.LetterGrade_LETTER_GRADE_D:
return "D"
- case LetterRatingDPlus:
+ case pb.LetterGrade_LETTER_GRADE_D_PLUS:
return "D+"
- case LetterRatingCMinus:
+ case pb.LetterGrade_LETTER_GRADE_C_MINUS:
return "C-"
- case LetterRatingC:
+ case pb.LetterGrade_LETTER_GRADE_C:
return "C"
- case LetterRatingCPlus:
+ case pb.LetterGrade_LETTER_GRADE_C_PLUS:
return "C+"
- case LetterRatingBMinus:
+ case pb.LetterGrade_LETTER_GRADE_B_MINUS:
return "B-"
- case LetterRatingB:
+ case pb.LetterGrade_LETTER_GRADE_B:
return "B"
- case LetterRatingBPlus:
+ case pb.LetterGrade_LETTER_GRADE_B_PLUS:
return "B+"
- case LetterRatingAMinus:
+ case pb.LetterGrade_LETTER_GRADE_A_MINUS:
return "A-"
- case LetterRatingA:
+ case pb.LetterGrade_LETTER_GRADE_A:
return "A"
- case LetterRatingAPlus:
+ case pb.LetterGrade_LETTER_GRADE_A_PLUS:
return "A+"
default:
- return "Unknown"
+ return "NA"
}
}
-func LetterRatingFromString(str string) (LetterRating, error) {
+func LetterRatingFromString(str string) LetterRating {
switch str {
- case "N/A":
- fallthrough
case "E":
- return LetterRatingE, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_E)
case "E+":
- return LetterRatingEPlus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_E_PLUS)
case "D-":
- return LetterRatingDMinus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_D_MINUS)
case "D":
- return LetterRatingD, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_D)
case "D+":
- return LetterRatingDPlus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_D_PLUS)
case "C-":
- return LetterRatingCMinus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_C_MINUS)
case "C":
- return LetterRatingC, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_C)
case "C+":
- return LetterRatingCPlus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_C_PLUS)
case "B-":
- return LetterRatingBMinus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_B_MINUS)
case "B":
- return LetterRatingB, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_B)
case "B+":
- return LetterRatingBPlus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_B_PLUS)
case "A-":
- return LetterRatingAMinus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_A_MINUS)
case "A":
- return LetterRatingA, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_A)
case "A+":
- return LetterRatingAPlus, nil
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_A_PLUS)
+ case "NA":
+ fallthrough
default:
- return 0, fmt.Errorf("unknown rating: %s", str)
+ return LetterRating(pb.LetterGrade_LETTER_GRADE_UNSPECIFIED)
}
}
+
+func (r LetterRating) Value() (driver.Value, error) {
+ return r.String(), nil
+}
+
+func (r *LetterRating) Scan(src any) error {
+ var source string
+ switch v := src.(type) {
+ case string:
+ source = v
+ case []byte:
+ source = string(v)
+ default:
+ return errors.New("incompatible type for LetterRating")
+ }
+ *r = LetterRatingFromString(source)
+ return nil
+}