From 28c1ee8c1bfb2752da8d46d8623e5aa508bc5fb1 Mon Sep 17 00:00:00 2001 From: Ross Fairbanks Date: Wed, 13 Jul 2022 19:00:40 +0200 Subject: [PATCH] Add carbonintensity.org.uk provider to CLI --- carbonintensity/client.go | 25 +++++++++++++++++-------- carbonintensity/schema.go | 2 ++ cmd/root.go | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/carbonintensity/client.go b/carbonintensity/client.go index 0e62603..5450a1c 100644 --- a/carbonintensity/client.go +++ b/carbonintensity/client.go @@ -5,15 +5,13 @@ import ( "encoding/json" "net/http" "time" - - gridintensity "github.com/thegreenwebfoundation/grid-intensity-go/api" ) const ProviderName = "carbonintensity.org.uk" type ApiOption func(*ApiClient) error -func New(opts ...ApiOption) (gridintensity.Provider, error) { +func New(opts ...ApiOption) (*ApiClient, error) { a := &ApiClient{} for _, opt := range opts { err := opt(a) @@ -41,14 +39,25 @@ type ApiClient struct { } func (a *ApiClient) GetCarbonIntensity(ctx context.Context, region string) (float64, error) { - latestData, err := a.getLatestCarbonIntensityData(ctx, region) + data, err := a.getCarbonIntensityData(ctx, region) if err != nil { return 0, err } - return latestData.Actual, nil + if data.Intensity == nil { + return 0, ErrNoResponse + } + return data.Intensity.Actual, nil +} + +func (a *ApiClient) GetCarbonIntensityData(ctx context.Context, region string) (*IntensityData, error) { + data, err := a.getCarbonIntensityData(ctx, region) + if err != nil { + return nil, err + } + return data, nil } -func (a *ApiClient) getLatestCarbonIntensityData(ctx context.Context, region string) (*Intensity, error) { +func (a *ApiClient) getCarbonIntensityData(ctx context.Context, region string) (*IntensityData, error) { if region != "UK" { return nil, ErrOnlyUK } @@ -74,8 +83,8 @@ func (a *ApiClient) getLatestCarbonIntensityData(ctx context.Context, region str return nil, err } - if len(respObj.Data) == 0 || respObj.Data[0].Intensity == nil { + if len(respObj.Data) == 0 { return nil, ErrNoResponse } - return respObj.Data[0].Intensity, nil + return &respObj.Data[0], nil } diff --git a/carbonintensity/schema.go b/carbonintensity/schema.go index 16d8f12..f46c8c2 100644 --- a/carbonintensity/schema.go +++ b/carbonintensity/schema.go @@ -5,6 +5,8 @@ type CarbonIntensityResponse struct { } type IntensityData struct { + From string `json:"from"` + To string `json:"to"` Intensity *Intensity `json:"intensity"` } diff --git a/cmd/root.go b/cmd/root.go index 038774c..595a0fa 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -14,6 +14,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" + "github.com/thegreenwebfoundation/grid-intensity-go/carbonintensity" "github.com/thegreenwebfoundation/grid-intensity-go/ember" "github.com/thegreenwebfoundation/grid-intensity-go/watttime" ) @@ -63,6 +64,26 @@ func init() { viper.BindPFlag(region, rootCmd.PersistentFlags().Lookup(region)) } +func getCarbonIntensityOrgUK(ctx context.Context, region string) error { + c, err := carbonintensity.New() + if err != nil { + return fmt.Errorf("could not make provider %v", err) + } + + result, err := c.GetCarbonIntensityData(ctx, region) + if err != nil { + return err + } + + bytes, err := json.MarshalIndent(result, "", "\t") + if err != nil { + return err + } + + fmt.Println(string(bytes)) + return nil +} + func getEmberGridIntensityForCountry(countryCode string) error { result, err := ember.GetGridIntensityForCountry(countryCode) if err != nil { @@ -149,6 +170,19 @@ func runRoot() error { } switch providerName { + case carbonintensity.ProviderName: + if regionCode == "" { + regionCode = "UK" + } + if regionCode != "UK" { + return fmt.Errorf("only region UK is supported") + } + viper.Set(region, regionCode) + + err = getCarbonIntensityOrgUK(ctx, regionCode) + if err != nil { + return err + } case ember.ProviderName: if regionCode == "" { regionCode, err = getCountryCode()