diff --git a/src/AWS/Pricing/EC2/Types.purs b/src/AWS/Pricing/EC2/Types.purs new file mode 100644 index 0000000..dd35ae3 --- /dev/null +++ b/src/AWS/Pricing/EC2/Types.purs @@ -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 + } diff --git a/src/AWS/Pricing/EC2/Utils.purs b/src/AWS/Pricing/EC2/Utils.purs new file mode 100644 index 0000000..1dbf090 --- /dev/null +++ b/src/AWS/Pricing/EC2/Utils.purs @@ -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: parseEC2Attributes internalProduct.attributes + } + where + parseEC2Attributes :: Json -> Either String (EC2Attributes ()) + parseEC2Attributes = decodeJson <#> lmap handleError + +parseEC2PriceList :: Json -> Either String EC2PriceList +parseEC2PriceList = decodeJson <#> bimap handleError toEC2PriceList diff --git a/src/AWS/Pricing/ECS/Types.purs b/src/AWS/Pricing/ECS/Types.purs new file mode 100644 index 0000000..c71a83e --- /dev/null +++ b/src/AWS/Pricing/ECS/Types.purs @@ -0,0 +1,42 @@ +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 + -- , storagetype :: String -- not always present + | 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" diff --git a/src/AWS/Pricing/ECS/Utils.purs b/src/AWS/Pricing/ECS/Utils.purs new file mode 100644 index 0000000..30bbe4c --- /dev/null +++ b/src/AWS/Pricing/ECS/Utils.purs @@ -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: parseECSAttributes internalProduct.attributes + } + where + parseECSAttributes :: Json -> Either String (ECSAttributes ()) + parseECSAttributes = decodeJson <#> lmap handleError + +parseECSPriceList :: Json -> Either String ECSPriceList +parseECSPriceList = decodeJson <#> bimap handleError toECSPriceList diff --git a/src/AWS/Pricing/Pricing.purs b/src/AWS/Pricing/Pricing.purs index ab66a88..c797b2e 100644 --- a/src/AWS/Pricing/Pricing.purs +++ b/src/AWS/Pricing/Pricing.purs @@ -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) diff --git a/src/AWS/Pricing/Types.purs b/src/AWS/Pricing/Types.purs index c69cda3..0e84a4f 100644 --- a/src/AWS/Pricing/Types.purs +++ b/src/AWS/Pricing/Types.purs @@ -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) @@ -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 @@ -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 } @@ -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" diff --git a/src/AWS/Pricing/Utils.purs b/src/AWS/Pricing/Utils.purs index 3ea21cf..62efb5a 100644 --- a/src/AWS/Pricing/Utils.purs +++ b/src/AWS/Pricing/Utils.purs @@ -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 @@ -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)"