Skip to content

Commit

Permalink
WIP: refactoring - create ECS & EC2 folders
Browse files Browse the repository at this point in the history
  • Loading branch information
tiphdousset committed May 28, 2021
1 parent 8608f38 commit cec4450
Show file tree
Hide file tree
Showing 7 changed files with 142 additions and 129 deletions.
31 changes: 31 additions & 0 deletions src/AWS/Pricing/EC2/Types.purs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
module AWS.Pricing.EC2.Types where

import AWS.Pricing.Types (Terms)
import Data.Either (Either)
import Data.Maybe (Maybe)

type GetEC2ProductsResponse
= { formatVersion :: String
, priceList :: Array (Either String EC2PriceList)
, nextToken :: Maybe String
}

type EC2Attributes r
= { instanceType :: String
, instanceFamily :: String
, operatingSystem :: String
, vcpu :: String
, servicename :: String
| r
}

type EC2Product r
= { attributes :: (Either String (EC2Attributes ())) | r }

type EC2PriceList
= { serviceCode :: String
, version :: String
, publicationDate :: String
, product :: EC2Product ()
, terms :: Terms
}
30 changes: 30 additions & 0 deletions src/AWS/Pricing/EC2/Utils.purs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
module AWS.Pricing.EC2.Utils where

import Prelude
import AWS.Core.Util (handleError)
import AWS.Pricing.EC2.Types (EC2Attributes, EC2PriceList, EC2Product)
import AWS.Pricing.Types (InternalPriceList, InternalProduct)
import AWS.Pricing.Utils (toTerms)
import Data.Argonaut (Json, decodeJson)
import Data.Bifunctor (lmap, bimap)
import Data.Either (Either)

toEC2PriceList :: InternalPriceList -> EC2PriceList
toEC2PriceList pl =
{ serviceCode: pl.serviceCode
, version: pl.version
, publicationDate: pl.publicationDate
, product: toEC2Product pl.product
, terms: toTerms pl.terms
}

toEC2Product :: InternalProduct -> EC2Product ()
toEC2Product internalProduct =
{ attributes: parseAttributes internalProduct.attributes
}
where
parseAttributes :: Json -> Either String (EC2Attributes ())
parseAttributes = decodeJson <#> lmap handleError

parseEC2PriceList :: Json -> Either String EC2PriceList
parseEC2PriceList = decodeJson <#> bimap handleError toEC2PriceList
41 changes: 41 additions & 0 deletions src/AWS/Pricing/ECS/Types.purs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
module AWS.Pricing.ECS.Types where

import Prelude
import Data.Either (Either)
import Data.Maybe (Maybe)
import AWS.Pricing.Types (Terms)

type GetECSProductsResponse
= { formatVersion :: String
, priceList :: Array (Either String ECSPriceList)
, nextToken :: Maybe String
}

type ECSAttributes r
= { servicecode :: String
, usagetype :: String
, servicename :: String
, operation :: String
| r
}

type ECSProduct r
= { attributes :: (Either String (ECSAttributes ())) | r }

type ECSPriceList
= { serviceCode :: String
, version :: String
, publicationDate :: String
, product :: ECSProduct ()
, terms :: Terms
}

data ECSUsageType
= EUC1FargateEphemeralStorageGBHours
| EUC1FargateGBHours
| EUC1FargatevCPUHoursperCPU

instance showECSUsageType :: Show ECSUsageType where
show EUC1FargateEphemeralStorageGBHours = "EUC1-Fargate-EphemeralStorage-GB-Hours"
show EUC1FargateGBHours = "EUC1-Fargate-GB-Hours"
show EUC1FargatevCPUHoursperCPU = "EUC1-Fargate-vCPU-Hours:perCPU"
34 changes: 34 additions & 0 deletions src/AWS/Pricing/ECS/Utils.purs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
module AWS.Pricing.ECS.Utils where

import Prelude
import AWS.Core.Util (handleError)
import AWS.Pricing.ECS.Types
( ECSPriceList
, ECSProduct
, ECSAttributes
)
import AWS.Pricing.Types (InternalPriceList, InternalProduct)
import AWS.Pricing.Utils (toTerms)
import Data.Argonaut (Json, decodeJson)
import Data.Bifunctor (lmap, bimap)
import Data.Either (Either)

toECSPriceList :: InternalPriceList -> ECSPriceList
toECSPriceList pl =
{ serviceCode: pl.serviceCode
, version: pl.version
, publicationDate: pl.publicationDate
, product: toECSProduct pl.product
, terms: toTerms pl.terms
}

toECSProduct :: InternalProduct -> ECSProduct ()
toECSProduct internalProduct =
{ attributes: parseAttributes internalProduct.attributes
}
where
parseAttributes :: Json -> Either String (ECSAttributes ())
parseAttributes = decodeJson <#> lmap handleError

parseECSPriceList :: Json -> Either String ECSPriceList
parseECSPriceList = decodeJson <#> bimap handleError toECSPriceList
7 changes: 5 additions & 2 deletions src/AWS/Pricing/Pricing.purs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@ import Prelude
import AWS.Core.Client (makeClientHelper)
import AWS.Core.Types (DefaultClientProps)
import AWS.Core.Util (unfoldrM1)
import AWS.Pricing.Types (Filter, GetEC2ProductsResponse, GetECSProductsResponse, EC2PriceList, ServiceCode)
import AWS.Pricing.Utils (parseEC2PriceList, parseECSPriceList)
import AWS.Pricing.EC2.Types (GetEC2ProductsResponse, EC2PriceList)
import AWS.Pricing.EC2.Utils (parseEC2PriceList)
import AWS.Pricing.ECS.Types (GetECSProductsResponse)
import AWS.Pricing.ECS.Utils (parseECSPriceList)
import AWS.Pricing.Types (Filter, ServiceCode)
import Control.Promise (Promise, toAffE)
import Data.Argonaut (Json)
import Data.Either (Either)
Expand Down
63 changes: 0 additions & 63 deletions src/AWS/Pricing/Types.purs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import Data.Argonaut (class DecodeJson, Json)
import Data.Argonaut.Encode (class EncodeJson)
import Data.Argonaut.Encode.Encoders (encodeString)
import Data.DateTime (DateTime)
import Data.Either (Either)
import Data.Map as Map
import Data.Maybe (Maybe)
import Data.Newtype (class Newtype)
Expand Down Expand Up @@ -41,45 +40,9 @@ instance showServiceCode :: Show ServiceCode where
show AmazonEC2 = "AmazonEC2"
show AmazonECS = "AmazonECS"

type GetEC2ProductsResponse
= { formatVersion :: String
, priceList :: Array (Either String EC2PriceList)
, nextToken :: Maybe String
}

type GetECSProductsResponse
= { formatVersion :: String
, priceList :: Array (Either String ECSPriceList)
, nextToken :: Maybe String
}

type EC2Attributes r
= { instanceType :: String
, instanceFamily :: String
, operatingSystem :: String
, vcpu :: String
, servicename :: String
| r
}

type ECSAttributes r
= { servicecode :: String
, usagetype :: String
, servicename :: String
, operation :: String
-- , storagetype :: String -- not always present
| r
}

type InternalProduct
= { attributes :: Json }

type EC2Product r
= { attributes :: (Either String (EC2Attributes ())) | r }

type ECSProduct r
= { attributes :: (Either String (ECSAttributes ())) | r }

type InternalPriceDimension r
= { description :: String
, unit :: String
Expand Down Expand Up @@ -129,22 +92,6 @@ type InternalPriceList
, terms :: InternalTerms ()
}

type EC2PriceList
= { serviceCode :: String
, version :: String
, publicationDate :: String
, product :: EC2Product ()
, terms :: Terms
}

type ECSPriceList
= { serviceCode :: String
, version :: String
, publicationDate :: String
, product :: ECSProduct ()
, terms :: Terms
}

type Terms
= { "OnDemand" :: OnDemand }

Expand Down Expand Up @@ -192,13 +139,3 @@ toUnit unit = case unit of
"Hrs" -> Hours
"Quantity" -> Quantity
_ -> Hours

data ECSUsageType
= EUC1FargateEphemeralStorageGBHours
| EUC1FargateGBHours
| EUC1FargatevCPUHoursperCPU

instance showECSUsageType :: Show ECSUsageType where
show EUC1FargateEphemeralStorageGBHours = "EUC1-Fargate-EphemeralStorage-GB-Hours"
show EUC1FargateGBHours = "EUC1-Fargate-GB-Hours"
show EUC1FargatevCPUHoursperCPU = "EUC1-Fargate-vCPU-Hours:perCPU"
65 changes: 1 addition & 64 deletions src/AWS/Pricing/Utils.purs
Original file line number Diff line number Diff line change
Expand Up @@ -2,72 +2,15 @@ module AWS.Pricing.Utils where

import Prelude
import AWS.Core.Types (Region)
import AWS.Core.Util (handleError)
import AWS.Pricing.Types
( FilterValue(..)
, InternalOnDemand
, InternalPriceDetails
, InternalPriceDimension
, InternalPriceList
, InternalProduct
, InternalTerms
, OnDemand(..)
, PriceDetails
, PriceDimension
, PriceDimensions(..)
, EC2PriceList
, ECSPriceList
, EC2Product
, ECSProduct
, EC2Attributes
, ECSAttributes
, Terms
, toUnit
)
import Data.Argonaut (Json, decodeJson)
import Data.Bifunctor (lmap, bimap)
import AWS.Pricing.Types (FilterValue(..), InternalOnDemand, InternalPriceDetails, InternalPriceDimension, InternalTerms, OnDemand(..), PriceDetails, PriceDimension, PriceDimensions(..), Terms, toUnit)
import Data.DateTime (DateTime)
import Data.Either (Either, hush)
import Data.Formatter.DateTime (unformatDateTime)
import Data.Newtype (unwrap)

toEC2PriceList :: InternalPriceList -> EC2PriceList
toEC2PriceList pl =
{ serviceCode: pl.serviceCode
, version: pl.version
, publicationDate: pl.publicationDate
, product: toEC2Product pl.product
, terms: toTerms pl.terms
}

toECSPriceList :: InternalPriceList -> ECSPriceList
toECSPriceList pl =
{ serviceCode: pl.serviceCode
, version: pl.version
, publicationDate: pl.publicationDate
, product: toECSProduct pl.product
, terms: toTerms pl.terms
}

toTerms :: InternalTerms () -> Terms
toTerms terms = { "OnDemand": toOnDemand terms."OnDemand" }

toEC2Product :: InternalProduct -> EC2Product ()
toEC2Product internalProduct =
{ attributes: parseEC2Attributes internalProduct.attributes
}
where
parseEC2Attributes :: Json -> Either String (EC2Attributes ())
parseEC2Attributes = decodeJson <#> lmap handleError

toECSProduct :: InternalProduct -> ECSProduct ()
toECSProduct internalProduct =
{ attributes: parseECSAttributes internalProduct.attributes
}
where
parseECSAttributes :: Json -> Either String (ECSAttributes ())
parseECSAttributes = decodeJson <#> lmap handleError

toOnDemand :: InternalOnDemand -> OnDemand
toOnDemand onDemand = (unwrap onDemand) <#> toPriceDetails # OnDemand

Expand All @@ -90,12 +33,6 @@ toPriceDimension priceDimension =
parseDateTime :: String -> Either String DateTime
parseDateTime = unformatDateTime "YYYY-MM-DDTHH:mm:ssZ"

parseEC2PriceList :: Json -> Either String EC2PriceList
parseEC2PriceList = decodeJson <#> bimap handleError toEC2PriceList

parseECSPriceList :: Json -> Either String ECSPriceList
parseECSPriceList = decodeJson <#> bimap handleError toECSPriceList

toLocation :: Region -> FilterValue
toLocation r = case unwrap r of
"eu-central-1" -> FilterValue "EU (Frankfurt)"
Expand Down

0 comments on commit cec4450

Please sign in to comment.