{-|
Module      : Google.Cloud.Compute.Disk
Copyright   : (c) 2025
License     : MIT
Maintainer  : 
Stability   : experimental

This module provides a Haskell client for Google Cloud Compute Engine Disk operations.
-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module Google.Cloud.Compute.Disk
  ( listDisks
  , insertDisk
  , DiskResponse (..)
  , InsertDiskOps (..)
  , InsertDiskResponse
  , Operation (..)
  , deleteDisk
  , createDiskSnapshot
  , CreateSnapshotResp 
  , CreateSnapshotOps (..)
  , Warning (..)
  , WarningData (..)
  , defaultCreateSnapshotOps
  , defaultInsertOps
  ) where

import Data.Aeson
import qualified Data.ByteString.Char8 as BS
import Data.Map (Map)
import Google.Cloud.Common.Core
import Google.Cloud.Compute.Common
import Network.HTTP.Simple

-- | Represents a warning object returned by Google Cloud API operations
data Warning = Warning
  { Warning -> String
code :: String       -- ^ Warning type identifier
  , Warning -> String
message :: String    -- ^ Human-readable warning message
  , Warning -> Maybe [WarningData]
data_ :: Maybe [WarningData] -- ^ Optional metadata about the warning
  }
  deriving (Int -> Warning -> ShowS
[Warning] -> ShowS
Warning -> String
(Int -> Warning -> ShowS)
-> (Warning -> String) -> ([Warning] -> ShowS) -> Show Warning
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Warning -> ShowS
showsPrec :: Int -> Warning -> ShowS
$cshow :: Warning -> String
show :: Warning -> String
$cshowList :: [Warning] -> ShowS
showList :: [Warning] -> ShowS
Show, Warning -> Warning -> Bool
(Warning -> Warning -> Bool)
-> (Warning -> Warning -> Bool) -> Eq Warning
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Warning -> Warning -> Bool
== :: Warning -> Warning -> Bool
$c/= :: Warning -> Warning -> Bool
/= :: Warning -> Warning -> Bool
Eq)

-- | Key-value pair providing additional context for warnings
data WarningData = WarningData
  { WarningData -> String
key :: String    -- ^ Metadata key describing the warning aspect
  , WarningData -> String
value :: String  -- ^ Metadata value associated with the key
  }
  deriving (Int -> WarningData -> ShowS
[WarningData] -> ShowS
WarningData -> String
(Int -> WarningData -> ShowS)
-> (WarningData -> String)
-> ([WarningData] -> ShowS)
-> Show WarningData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> WarningData -> ShowS
showsPrec :: Int -> WarningData -> ShowS
$cshow :: WarningData -> String
show :: WarningData -> String
$cshowList :: [WarningData] -> ShowS
showList :: [WarningData] -> ShowS
Show, WarningData -> WarningData -> Bool
(WarningData -> WarningData -> Bool)
-> (WarningData -> WarningData -> Bool) -> Eq WarningData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: WarningData -> WarningData -> Bool
== :: WarningData -> WarningData -> Bool
$c/= :: WarningData -> WarningData -> Bool
/= :: WarningData -> WarningData -> Bool
Eq)

-- | Response format for disk listing operations
data DiskResponse = DiskResponse
  { DiskResponse -> Maybe String
kind :: Maybe String         -- ^ Type identifier ("compute#diskList")
  , DiskResponse -> Maybe String
id :: Maybe String           -- ^ Unique identifier for the resource
  , DiskResponse -> Maybe [DiskItem]
items :: Maybe [DiskItem]    -- ^ List of disks in the project/zone
  , DiskResponse -> Maybe String
nextPageToken :: Maybe String -- ^ Pagination token for next page
  , DiskResponse -> Maybe String
selfLink :: Maybe String     -- ^ Server-defined URL for the resource
  , DiskResponse -> Maybe Warning
warning :: Maybe Warning     -- ^ Any warnings about the result
  }
  deriving (Int -> DiskResponse -> ShowS
[DiskResponse] -> ShowS
DiskResponse -> String
(Int -> DiskResponse -> ShowS)
-> (DiskResponse -> String)
-> ([DiskResponse] -> ShowS)
-> Show DiskResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DiskResponse -> ShowS
showsPrec :: Int -> DiskResponse -> ShowS
$cshow :: DiskResponse -> String
show :: DiskResponse -> String
$cshowList :: [DiskResponse] -> ShowS
showList :: [DiskResponse] -> ShowS
Show, DiskResponse -> DiskResponse -> Bool
(DiskResponse -> DiskResponse -> Bool)
-> (DiskResponse -> DiskResponse -> Bool) -> Eq DiskResponse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DiskResponse -> DiskResponse -> Bool
== :: DiskResponse -> DiskResponse -> Bool
$c/= :: DiskResponse -> DiskResponse -> Bool
/= :: DiskResponse -> DiskResponse -> Bool
Eq)

-- | Represents a Google Cloud Persistent Disk
data DiskItem = DiskItem
  { DiskItem -> Maybe String
kind :: Maybe String              -- ^ Type identifier ("compute#disk")
  , DiskItem -> Maybe String
id :: Maybe String                -- ^ Unique numeric ID
  , DiskItem -> Maybe String
creationTimestamp :: Maybe String -- ^ ISO 8601 creation timestamp
  , DiskItem -> Maybe String
name :: Maybe String              -- ^ User-provided disk name
  , DiskItem -> Maybe String
description :: Maybe String       -- ^ Optional disk description
  , DiskItem -> Maybe String
sizeGb :: Maybe String            -- ^ Disk size in gigabytes
  , DiskItem -> Maybe String
zone :: Maybe String              -- ^ Zone where the disk resides
  , DiskItem -> Maybe String
status :: Maybe String            -- ^ Current status (READY, CREATING, etc.)
  , DiskItem -> Maybe String
sourceSnapshot :: Maybe String    -- ^ Source snapshot URL if applicable
  , DiskItem -> Maybe String
sourceSnapshotId :: Maybe String  -- ^ Unique ID of source snapshot
  , DiskItem -> Maybe String
sourceImage :: Maybe String       -- ^ Source image URL if applicable
  , DiskItem -> Maybe String
sourceImageId :: Maybe String     -- ^ Unique ID of source image
  , DiskItem -> Maybe String
type_ :: Maybe String             -- ^ Disk type (e.g., "pd-standard")
  , DiskItem -> Maybe (Map String String)
labels :: Maybe (Map String String) -- ^ User-defined labels
  , DiskItem -> Maybe String
labelFingerprint :: Maybe String  -- ^ Fingerprint for label operations
  , DiskItem -> Maybe [String]
licenses :: Maybe [String]        -- ^ License resource URLs
  , DiskItem -> Maybe [String]
users :: Maybe [String]           -- ^ Instances currently using the disk
  , DiskItem -> Maybe [GuestOsFeature]
guestOsFeatures :: Maybe [GuestOsFeature] -- ^ OS-specific features
  , DiskItem -> Maybe EncryptionKey
diskEncryptionKey :: Maybe EncryptionKey -- ^ Disk encryption details
  , DiskItem -> Maybe String
sourceDisk :: Maybe String        -- ^ Source disk URL for regional disks
  , DiskItem -> Maybe String
sourceDiskId :: Maybe String      -- ^ Unique ID of source disk
  , DiskItem -> Maybe String
physicalBlockSizeBytes :: Maybe String -- ^ Physical block size in bytes
  , DiskItem -> Maybe String
provisionedIops :: Maybe String   -- ^ Provisioned IOPS for SSD
  , DiskItem -> Maybe [String]
resourcePolicies :: Maybe [String] -- ^ Resource policy URLs
  , DiskItem -> Maybe String
selfLink :: Maybe String          -- ^ Server-defined URL for the disk
  }
  deriving (Int -> DiskItem -> ShowS
[DiskItem] -> ShowS
DiskItem -> String
(Int -> DiskItem -> ShowS)
-> (DiskItem -> String) -> ([DiskItem] -> ShowS) -> Show DiskItem
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DiskItem -> ShowS
showsPrec :: Int -> DiskItem -> ShowS
$cshow :: DiskItem -> String
show :: DiskItem -> String
$cshowList :: [DiskItem] -> ShowS
showList :: [DiskItem] -> ShowS
Show, DiskItem -> DiskItem -> Bool
(DiskItem -> DiskItem -> Bool)
-> (DiskItem -> DiskItem -> Bool) -> Eq DiskItem
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DiskItem -> DiskItem -> Bool
== :: DiskItem -> DiskItem -> Bool
$c/= :: DiskItem -> DiskItem -> Bool
/= :: DiskItem -> DiskItem -> Bool
Eq)

-- | Guest OS features enabled on the disk
data GuestOsFeature = GuestOsFeature
  { GuestOsFeature -> String
type_ :: String  -- ^ Feature type (e.g., "UEFI_COMPATIBLE")
  }
  deriving (Int -> GuestOsFeature -> ShowS
[GuestOsFeature] -> ShowS
GuestOsFeature -> String
(Int -> GuestOsFeature -> ShowS)
-> (GuestOsFeature -> String)
-> ([GuestOsFeature] -> ShowS)
-> Show GuestOsFeature
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GuestOsFeature -> ShowS
showsPrec :: Int -> GuestOsFeature -> ShowS
$cshow :: GuestOsFeature -> String
show :: GuestOsFeature -> String
$cshowList :: [GuestOsFeature] -> ShowS
showList :: [GuestOsFeature] -> ShowS
Show, GuestOsFeature -> GuestOsFeature -> Bool
(GuestOsFeature -> GuestOsFeature -> Bool)
-> (GuestOsFeature -> GuestOsFeature -> Bool) -> Eq GuestOsFeature
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GuestOsFeature -> GuestOsFeature -> Bool
== :: GuestOsFeature -> GuestOsFeature -> Bool
$c/= :: GuestOsFeature -> GuestOsFeature -> Bool
/= :: GuestOsFeature -> GuestOsFeature -> Bool
Eq)

-- | Disk encryption key information
data EncryptionKey = EncryptionKey
  { EncryptionKey -> Maybe String
rawKey :: Maybe String        -- ^ Raw encryption key (base64)
  , EncryptionKey -> Maybe String
rsaEncryptedKey :: Maybe String -- ^ RSA-wrapped encryption key
  , EncryptionKey -> Maybe String
sha256 :: Maybe String        -- ^ RFC 4648 base64 SHA-256 hash
  }
  deriving (Int -> EncryptionKey -> ShowS
[EncryptionKey] -> ShowS
EncryptionKey -> String
(Int -> EncryptionKey -> ShowS)
-> (EncryptionKey -> String)
-> ([EncryptionKey] -> ShowS)
-> Show EncryptionKey
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EncryptionKey -> ShowS
showsPrec :: Int -> EncryptionKey -> ShowS
$cshow :: EncryptionKey -> String
show :: EncryptionKey -> String
$cshowList :: [EncryptionKey] -> ShowS
showList :: [EncryptionKey] -> ShowS
Show, EncryptionKey -> EncryptionKey -> Bool
(EncryptionKey -> EncryptionKey -> Bool)
-> (EncryptionKey -> EncryptionKey -> Bool) -> Eq EncryptionKey
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EncryptionKey -> EncryptionKey -> Bool
== :: EncryptionKey -> EncryptionKey -> Bool
$c/= :: EncryptionKey -> EncryptionKey -> Bool
/= :: EncryptionKey -> EncryptionKey -> Bool
Eq)

-- | Long-running operation resource
data Operation = Operation
  { CreateSnapshotResp -> Maybe String
id :: Maybe String          -- ^ Unique operation ID
  , CreateSnapshotResp -> Maybe String
name :: Maybe String        -- ^ Operation name
  , CreateSnapshotResp -> Maybe String
zone :: Maybe String        -- ^ Zone where operation is executed
  , CreateSnapshotResp -> Maybe String
operationType :: Maybe String -- ^ Operation type (insert, delete, etc.)
  , CreateSnapshotResp -> Maybe String
targetLink :: Maybe String  -- ^ URL of resource being modified
  , CreateSnapshotResp -> Maybe String
status :: Maybe String      -- ^ Current status (DONE, RUNNING, etc.)
  , CreateSnapshotResp -> Maybe Int
progress :: Maybe Int       -- ^ Operation progress (0-100)
  , CreateSnapshotResp -> Maybe String
insertTime :: Maybe String  -- ^ ISO 8601 creation timestamp
  , CreateSnapshotResp -> Maybe String
startTime :: Maybe String   -- ^ ISO 8601 start timestamp
  , CreateSnapshotResp -> Maybe String
endTime :: Maybe String     -- ^ ISO 8601 completion timestamp
  , CreateSnapshotResp -> Maybe OperationError
error :: Maybe OperationError -- ^ Error details if failed
  , CreateSnapshotResp -> Maybe [Warning]
warnings :: Maybe [Warning] -- ^ Warnings during operation
  , CreateSnapshotResp -> Maybe String
selfLink :: Maybe String    -- ^ Server-defined URL for the operation
  }
  deriving (Int -> CreateSnapshotResp -> ShowS
[CreateSnapshotResp] -> ShowS
CreateSnapshotResp -> String
(Int -> CreateSnapshotResp -> ShowS)
-> (CreateSnapshotResp -> String)
-> ([CreateSnapshotResp] -> ShowS)
-> Show CreateSnapshotResp
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CreateSnapshotResp -> ShowS
showsPrec :: Int -> CreateSnapshotResp -> ShowS
$cshow :: CreateSnapshotResp -> String
show :: CreateSnapshotResp -> String
$cshowList :: [CreateSnapshotResp] -> ShowS
showList :: [CreateSnapshotResp] -> ShowS
Show, CreateSnapshotResp -> CreateSnapshotResp -> Bool
(CreateSnapshotResp -> CreateSnapshotResp -> Bool)
-> (CreateSnapshotResp -> CreateSnapshotResp -> Bool)
-> Eq CreateSnapshotResp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CreateSnapshotResp -> CreateSnapshotResp -> Bool
== :: CreateSnapshotResp -> CreateSnapshotResp -> Bool
$c/= :: CreateSnapshotResp -> CreateSnapshotResp -> Bool
/= :: CreateSnapshotResp -> CreateSnapshotResp -> Bool
Eq)

-- | Error information from failed operations
data OperationError = OperationError
  { OperationError -> [ErrorDetail]
errors :: [ErrorDetail] -- ^ List of error details
  }
  deriving (Int -> OperationError -> ShowS
[OperationError] -> ShowS
OperationError -> String
(Int -> OperationError -> ShowS)
-> (OperationError -> String)
-> ([OperationError] -> ShowS)
-> Show OperationError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> OperationError -> ShowS
showsPrec :: Int -> OperationError -> ShowS
$cshow :: OperationError -> String
show :: OperationError -> String
$cshowList :: [OperationError] -> ShowS
showList :: [OperationError] -> ShowS
Show, OperationError -> OperationError -> Bool
(OperationError -> OperationError -> Bool)
-> (OperationError -> OperationError -> Bool) -> Eq OperationError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: OperationError -> OperationError -> Bool
== :: OperationError -> OperationError -> Bool
$c/= :: OperationError -> OperationError -> Bool
/= :: OperationError -> OperationError -> Bool
Eq)

-- | Detailed error information
data ErrorDetail = ErrorDetail
  { ErrorDetail -> String
code :: String         -- ^ Error type identifier
  , ErrorDetail -> String
message :: String      -- ^ Human-readable error message
  , ErrorDetail -> Maybe String
location :: Maybe String -- ^ Location in request that triggered error
  }
  deriving (Int -> ErrorDetail -> ShowS
[ErrorDetail] -> ShowS
ErrorDetail -> String
(Int -> ErrorDetail -> ShowS)
-> (ErrorDetail -> String)
-> ([ErrorDetail] -> ShowS)
-> Show ErrorDetail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ErrorDetail -> ShowS
showsPrec :: Int -> ErrorDetail -> ShowS
$cshow :: ErrorDetail -> String
show :: ErrorDetail -> String
$cshowList :: [ErrorDetail] -> ShowS
showList :: [ErrorDetail] -> ShowS
Show, ErrorDetail -> ErrorDetail -> Bool
(ErrorDetail -> ErrorDetail -> Bool)
-> (ErrorDetail -> ErrorDetail -> Bool) -> Eq ErrorDetail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ErrorDetail -> ErrorDetail -> Bool
== :: ErrorDetail -> ErrorDetail -> Bool
$c/= :: ErrorDetail -> ErrorDetail -> Bool
/= :: ErrorDetail -> ErrorDetail -> Bool
Eq)

-- | Disk creation options
data InsertDiskOps = InsertDiskOps
  { InsertDiskOps -> String
name :: String                -- ^ Required disk name
  , InsertDiskOps -> String
sizeGb :: String              -- ^ Required size in gigabytes
  , InsertDiskOps -> Maybe String
description :: Maybe String   -- ^ Optional description
  , InsertDiskOps -> Maybe String
type_ :: Maybe String         -- ^ Disk type (default: pd-standard)
  , InsertDiskOps -> Maybe String
sourceImage :: Maybe String   -- ^ Source image URL for disk creation
  , InsertDiskOps -> Maybe String
sourceSnapshot :: Maybe String -- ^ Source snapshot URL for disk creation
  , InsertDiskOps -> Maybe (Map String String)
labels :: Maybe (Map String String) -- ^ Initial labels
  , InsertDiskOps -> Maybe [GuestOsFeature]
guestOsFeatures :: Maybe [GuestOsFeature] -- ^ OS features to enable
  , InsertDiskOps -> Maybe EncryptionKey
diskEncryptionKey :: Maybe EncryptionKey -- ^ Encryption configuration
  }
  deriving (Int -> InsertDiskOps -> ShowS
[InsertDiskOps] -> ShowS
InsertDiskOps -> String
(Int -> InsertDiskOps -> ShowS)
-> (InsertDiskOps -> String)
-> ([InsertDiskOps] -> ShowS)
-> Show InsertDiskOps
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InsertDiskOps -> ShowS
showsPrec :: Int -> InsertDiskOps -> ShowS
$cshow :: InsertDiskOps -> String
show :: InsertDiskOps -> String
$cshowList :: [InsertDiskOps] -> ShowS
showList :: [InsertDiskOps] -> ShowS
Show, InsertDiskOps -> InsertDiskOps -> Bool
(InsertDiskOps -> InsertDiskOps -> Bool)
-> (InsertDiskOps -> InsertDiskOps -> Bool) -> Eq InsertDiskOps
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InsertDiskOps -> InsertDiskOps -> Bool
== :: InsertDiskOps -> InsertDiskOps -> Bool
$c/= :: InsertDiskOps -> InsertDiskOps -> Bool
/= :: InsertDiskOps -> InsertDiskOps -> Bool
Eq)

-- | Alias for operation response from disk insertion
type InsertDiskResponse = Operation

-- | Snapshot creation options
data CreateSnapshotOps = CreateSnapshotOps
  { CreateSnapshotOps -> String
name :: String                -- ^ Required snapshot name
  , CreateSnapshotOps -> Maybe String
description :: Maybe String   -- ^ Optional description
  , CreateSnapshotOps -> Maybe (Map String String)
labels :: Maybe (Map String String) -- ^ Labels for the snapshot
  , CreateSnapshotOps -> Maybe [String]
storageLocations :: Maybe [String] -- ^ Preferred storage locations
  , CreateSnapshotOps -> Maybe EncryptionKey
snapshotEncryptionKey :: Maybe EncryptionKey -- ^ Snapshot encryption
  }
  deriving (Int -> CreateSnapshotOps -> ShowS
[CreateSnapshotOps] -> ShowS
CreateSnapshotOps -> String
(Int -> CreateSnapshotOps -> ShowS)
-> (CreateSnapshotOps -> String)
-> ([CreateSnapshotOps] -> ShowS)
-> Show CreateSnapshotOps
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CreateSnapshotOps -> ShowS
showsPrec :: Int -> CreateSnapshotOps -> ShowS
$cshow :: CreateSnapshotOps -> String
show :: CreateSnapshotOps -> String
$cshowList :: [CreateSnapshotOps] -> ShowS
showList :: [CreateSnapshotOps] -> ShowS
Show, CreateSnapshotOps -> CreateSnapshotOps -> Bool
(CreateSnapshotOps -> CreateSnapshotOps -> Bool)
-> (CreateSnapshotOps -> CreateSnapshotOps -> Bool)
-> Eq CreateSnapshotOps
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CreateSnapshotOps -> CreateSnapshotOps -> Bool
== :: CreateSnapshotOps -> CreateSnapshotOps -> Bool
$c/= :: CreateSnapshotOps -> CreateSnapshotOps -> Bool
/= :: CreateSnapshotOps -> CreateSnapshotOps -> Bool
Eq)

-- | Alias for operation response from snapshot creation
type CreateSnapshotResp = Operation

data ListDisksQuery = ListDisksQuery
  { ListDisksQuery -> Maybe String
filter_ :: Maybe String
  , ListDisksQuery -> Maybe Int
maxResults :: Maybe Int
  , ListDisksQuery -> Maybe String
pageToken :: Maybe String
  , ListDisksQuery -> Maybe String
orderBy :: Maybe String
  }
  deriving (Int -> ListDisksQuery -> ShowS
[ListDisksQuery] -> ShowS
ListDisksQuery -> String
(Int -> ListDisksQuery -> ShowS)
-> (ListDisksQuery -> String)
-> ([ListDisksQuery] -> ShowS)
-> Show ListDisksQuery
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ListDisksQuery -> ShowS
showsPrec :: Int -> ListDisksQuery -> ShowS
$cshow :: ListDisksQuery -> String
show :: ListDisksQuery -> String
$cshowList :: [ListDisksQuery] -> ShowS
showList :: [ListDisksQuery] -> ShowS
Show, ListDisksQuery -> ListDisksQuery -> Bool
(ListDisksQuery -> ListDisksQuery -> Bool)
-> (ListDisksQuery -> ListDisksQuery -> Bool) -> Eq ListDisksQuery
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ListDisksQuery -> ListDisksQuery -> Bool
== :: ListDisksQuery -> ListDisksQuery -> Bool
$c/= :: ListDisksQuery -> ListDisksQuery -> Bool
/= :: ListDisksQuery -> ListDisksQuery -> Bool
Eq)

-- | Query parameters for insertDisk
data InsertDiskQuery = InsertDiskQuery
  { InsertDiskQuery -> Maybe String
sourceImage :: Maybe String
  , InsertDiskQuery -> Maybe EncryptionKey
sourceImageEncryptionKey :: Maybe EncryptionKey
  }
  deriving (Int -> InsertDiskQuery -> ShowS
[InsertDiskQuery] -> ShowS
InsertDiskQuery -> String
(Int -> InsertDiskQuery -> ShowS)
-> (InsertDiskQuery -> String)
-> ([InsertDiskQuery] -> ShowS)
-> Show InsertDiskQuery
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InsertDiskQuery -> ShowS
showsPrec :: Int -> InsertDiskQuery -> ShowS
$cshow :: InsertDiskQuery -> String
show :: InsertDiskQuery -> String
$cshowList :: [InsertDiskQuery] -> ShowS
showList :: [InsertDiskQuery] -> ShowS
Show, InsertDiskQuery -> InsertDiskQuery -> Bool
(InsertDiskQuery -> InsertDiskQuery -> Bool)
-> (InsertDiskQuery -> InsertDiskQuery -> Bool)
-> Eq InsertDiskQuery
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InsertDiskQuery -> InsertDiskQuery -> Bool
== :: InsertDiskQuery -> InsertDiskQuery -> Bool
$c/= :: InsertDiskQuery -> InsertDiskQuery -> Bool
/= :: InsertDiskQuery -> InsertDiskQuery -> Bool
Eq)

-- | Query parameters for deleteDisk
data DeleteDiskQuery = DeleteDiskQuery
  { DeleteDiskQuery -> Maybe Bool
force :: Maybe Bool
  }
  deriving (Int -> DeleteDiskQuery -> ShowS
[DeleteDiskQuery] -> ShowS
DeleteDiskQuery -> String
(Int -> DeleteDiskQuery -> ShowS)
-> (DeleteDiskQuery -> String)
-> ([DeleteDiskQuery] -> ShowS)
-> Show DeleteDiskQuery
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DeleteDiskQuery -> ShowS
showsPrec :: Int -> DeleteDiskQuery -> ShowS
$cshow :: DeleteDiskQuery -> String
show :: DeleteDiskQuery -> String
$cshowList :: [DeleteDiskQuery] -> ShowS
showList :: [DeleteDiskQuery] -> ShowS
Show, DeleteDiskQuery -> DeleteDiskQuery -> Bool
(DeleteDiskQuery -> DeleteDiskQuery -> Bool)
-> (DeleteDiskQuery -> DeleteDiskQuery -> Bool)
-> Eq DeleteDiskQuery
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DeleteDiskQuery -> DeleteDiskQuery -> Bool
== :: DeleteDiskQuery -> DeleteDiskQuery -> Bool
$c/= :: DeleteDiskQuery -> DeleteDiskQuery -> Bool
/= :: DeleteDiskQuery -> DeleteDiskQuery -> Bool
Eq)

-- | Query parameters for createDiskSnapshot
data CreateSnapshotQuery = CreateSnapshotQuery
  { CreateSnapshotQuery -> Maybe Bool
guestFlush :: Maybe Bool
  }
  deriving (Int -> CreateSnapshotQuery -> ShowS
[CreateSnapshotQuery] -> ShowS
CreateSnapshotQuery -> String
(Int -> CreateSnapshotQuery -> ShowS)
-> (CreateSnapshotQuery -> String)
-> ([CreateSnapshotQuery] -> ShowS)
-> Show CreateSnapshotQuery
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CreateSnapshotQuery -> ShowS
showsPrec :: Int -> CreateSnapshotQuery -> ShowS
$cshow :: CreateSnapshotQuery -> String
show :: CreateSnapshotQuery -> String
$cshowList :: [CreateSnapshotQuery] -> ShowS
showList :: [CreateSnapshotQuery] -> ShowS
Show, CreateSnapshotQuery -> CreateSnapshotQuery -> Bool
(CreateSnapshotQuery -> CreateSnapshotQuery -> Bool)
-> (CreateSnapshotQuery -> CreateSnapshotQuery -> Bool)
-> Eq CreateSnapshotQuery
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CreateSnapshotQuery -> CreateSnapshotQuery -> Bool
== :: CreateSnapshotQuery -> CreateSnapshotQuery -> Bool
$c/= :: CreateSnapshotQuery -> CreateSnapshotQuery -> Bool
/= :: CreateSnapshotQuery -> CreateSnapshotQuery -> Bool
Eq)

-- JSON Instances

instance FromJSON WarningData where
  parseJSON :: Value -> Parser WarningData
parseJSON = String
-> (Object -> Parser WarningData) -> Value -> Parser WarningData
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"WarningData" ((Object -> Parser WarningData) -> Value -> Parser WarningData)
-> (Object -> Parser WarningData) -> Value -> Parser WarningData
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    String -> String -> WarningData
WarningData
      (String -> String -> WarningData)
-> Parser String -> Parser (String -> WarningData)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"key"
      Parser (String -> WarningData)
-> Parser String -> Parser WarningData
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"value"

instance ToJSON WarningData where
  toJSON :: WarningData -> Value
toJSON (WarningData String
key String
value) =
    [Pair] -> Value
object
      [ Key
"key" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
key
      , Key
"value" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
value
      ]

instance FromJSON Warning where
  parseJSON :: Value -> Parser Warning
parseJSON = String -> (Object -> Parser Warning) -> Value -> Parser Warning
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Warning" ((Object -> Parser Warning) -> Value -> Parser Warning)
-> (Object -> Parser Warning) -> Value -> Parser Warning
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    String -> String -> Maybe [WarningData] -> Warning
Warning
      (String -> String -> Maybe [WarningData] -> Warning)
-> Parser String
-> Parser (String -> Maybe [WarningData] -> Warning)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"code"
      Parser (String -> Maybe [WarningData] -> Warning)
-> Parser String -> Parser (Maybe [WarningData] -> Warning)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"message"
      Parser (Maybe [WarningData] -> Warning)
-> Parser (Maybe [WarningData]) -> Parser Warning
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe [WarningData])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"data"

instance ToJSON Warning where
  toJSON :: Warning -> Value
toJSON (Warning String
code String
message Maybe [WarningData]
data_) =
    [Pair] -> Value
object
      [ Key
"code" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
code
      , Key
"message" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
message
      , Key
"data" Key -> Maybe [WarningData] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [WarningData]
data_
      ]

instance FromJSON GuestOsFeature where
  parseJSON :: Value -> Parser GuestOsFeature
parseJSON = String
-> (Object -> Parser GuestOsFeature)
-> Value
-> Parser GuestOsFeature
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"GuestOsFeature" ((Object -> Parser GuestOsFeature)
 -> Value -> Parser GuestOsFeature)
-> (Object -> Parser GuestOsFeature)
-> Value
-> Parser GuestOsFeature
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    String -> GuestOsFeature
GuestOsFeature
      (String -> GuestOsFeature)
-> Parser String -> Parser GuestOsFeature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"type"

instance ToJSON GuestOsFeature where
  toJSON :: GuestOsFeature -> Value
toJSON (GuestOsFeature String
type_) =
    [Pair] -> Value
object
      [ Key
"type" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
type_
      ]

instance FromJSON EncryptionKey where
  parseJSON :: Value -> Parser EncryptionKey
parseJSON = String
-> (Object -> Parser EncryptionKey)
-> Value
-> Parser EncryptionKey
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"EncryptionKey" ((Object -> Parser EncryptionKey) -> Value -> Parser EncryptionKey)
-> (Object -> Parser EncryptionKey)
-> Value
-> Parser EncryptionKey
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    Maybe String -> Maybe String -> Maybe String -> EncryptionKey
EncryptionKey
      (Maybe String -> Maybe String -> Maybe String -> EncryptionKey)
-> Parser (Maybe String)
-> Parser (Maybe String -> Maybe String -> EncryptionKey)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"rawKey"
      Parser (Maybe String -> Maybe String -> EncryptionKey)
-> Parser (Maybe String) -> Parser (Maybe String -> EncryptionKey)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"rsaEncryptedKey"
      Parser (Maybe String -> EncryptionKey)
-> Parser (Maybe String) -> Parser EncryptionKey
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sha256"

instance ToJSON EncryptionKey where
  toJSON :: EncryptionKey -> Value
toJSON (EncryptionKey Maybe String
rawKey Maybe String
rsaEncryptedKey Maybe String
sha256) =
    [Pair] -> Value
object
      [ Key
"rawKey" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
rawKey
      , Key
"rsaEncryptedKey" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
rsaEncryptedKey
      , Key
"sha256" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
sha256
      ]

instance FromJSON DiskItem where
  parseJSON :: Value -> Parser DiskItem
parseJSON = String -> (Object -> Parser DiskItem) -> Value -> Parser DiskItem
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"DiskItem" ((Object -> Parser DiskItem) -> Value -> Parser DiskItem)
-> (Object -> Parser DiskItem) -> Value -> Parser DiskItem
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe (Map String String)
-> Maybe String
-> Maybe [String]
-> Maybe [String]
-> Maybe [GuestOsFeature]
-> Maybe EncryptionKey
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe [String]
-> Maybe String
-> DiskItem
DiskItem
      (Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe (Map String String)
 -> Maybe String
 -> Maybe [String]
 -> Maybe [String]
 -> Maybe [GuestOsFeature]
 -> Maybe EncryptionKey
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe [String]
 -> Maybe String
 -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"kind"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"id"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"creationTimestamp"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"name"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"description"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sizeGb"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"zone"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"status"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sourceSnapshot"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sourceSnapshotId"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sourceImage"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sourceImageId"
      Parser
  (Maybe String
   -> Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe (Map String String)
      -> Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"type"
      Parser
  (Maybe (Map String String)
   -> Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe (Map String String))
-> Parser
     (Maybe String
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe (Map String String))
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"labels"
      Parser
  (Maybe String
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe [String]
      -> Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"labelFingerprint"
      Parser
  (Maybe [String]
   -> Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe [String])
-> Parser
     (Maybe [String]
      -> Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe [String])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"licenses"
      Parser
  (Maybe [String]
   -> Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe [String])
-> Parser
     (Maybe [GuestOsFeature]
      -> Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe [String])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"users"
      Parser
  (Maybe [GuestOsFeature]
   -> Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe [GuestOsFeature])
-> Parser
     (Maybe EncryptionKey
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe [GuestOsFeature])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"guestOsFeatures"
      Parser
  (Maybe EncryptionKey
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe EncryptionKey)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe EncryptionKey)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"diskEncryptionKey"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe [String]
      -> Maybe String
      -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sourceDisk"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe [String]
   -> Maybe String
   -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String -> Maybe [String] -> Maybe String -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sourceDiskId"
      Parser
  (Maybe String
   -> Maybe String -> Maybe [String] -> Maybe String -> DiskItem)
-> Parser (Maybe String)
-> Parser
     (Maybe String -> Maybe [String] -> Maybe String -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"physicalBlockSizeBytes"
      Parser (Maybe String -> Maybe [String] -> Maybe String -> DiskItem)
-> Parser (Maybe String)
-> Parser (Maybe [String] -> Maybe String -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"provisionedIops"
      Parser (Maybe [String] -> Maybe String -> DiskItem)
-> Parser (Maybe [String]) -> Parser (Maybe String -> DiskItem)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe [String])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"resourcePolicies"
      Parser (Maybe String -> DiskItem)
-> Parser (Maybe String) -> Parser DiskItem
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"selfLink"

instance ToJSON DiskItem where
  toJSON :: DiskItem -> Value
toJSON
    ( DiskItem
        Maybe String
kind
        Maybe String
id_
        Maybe String
creationTimestamp
        Maybe String
name
        Maybe String
description
        Maybe String
sizeGb
        Maybe String
zone
        Maybe String
status
        Maybe String
sourceSnapshot
        Maybe String
sourceSnapshotId
        Maybe String
sourceImage
        Maybe String
sourceImageId
        Maybe String
type_
        Maybe (Map String String)
labels
        Maybe String
labelFingerprint
        Maybe [String]
licenses
        Maybe [String]
users
        Maybe [GuestOsFeature]
guestOsFeatures
        Maybe EncryptionKey
diskEncryptionKey
        Maybe String
sourceDisk
        Maybe String
sourceDiskId
        Maybe String
physicalBlockSizeBytes
        Maybe String
provisionedIops
        Maybe [String]
resourcePolicies
        Maybe String
selfLink
      ) =
      [Pair] -> Value
object
        [ Key
"kind" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
kind
        , Key
"id" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
id_
        , Key
"creationTimestamp" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
creationTimestamp
        , Key
"name" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
name
        , Key
"description" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
description
        , Key
"sizeGb" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
sizeGb
        , Key
"zone" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
zone
        , Key
"status" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
status
        , Key
"sourceSnapshot" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
sourceSnapshot
        , Key
"sourceSnapshotId" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
sourceSnapshotId
        , Key
"sourceImage" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
sourceImage
        , Key
"sourceImageId" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
sourceImageId
        , Key
"type" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
type_
        , Key
"labels" Key -> Maybe (Map String String) -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe (Map String String)
labels
        , Key
"labelFingerprint" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
labelFingerprint
        , Key
"licenses" Key -> Maybe [String] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [String]
licenses
        , Key
"users" Key -> Maybe [String] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [String]
users
        , Key
"guestOsFeatures" Key -> Maybe [GuestOsFeature] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [GuestOsFeature]
guestOsFeatures
        , Key
"diskEncryptionKey" Key -> Maybe EncryptionKey -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe EncryptionKey
diskEncryptionKey
        , Key
"sourceDisk" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
sourceDisk
        , Key
"sourceDiskId" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
sourceDiskId
        , Key
"physicalBlockSizeBytes" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
physicalBlockSizeBytes
        , Key
"provisionedIops" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
provisionedIops
        , Key
"resourcePolicies" Key -> Maybe [String] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [String]
resourcePolicies
        , Key
"selfLink" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
selfLink
        ]

instance FromJSON DiskResponse where
  parseJSON :: Value -> Parser DiskResponse
parseJSON = String
-> (Object -> Parser DiskResponse) -> Value -> Parser DiskResponse
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"DiskResponse" ((Object -> Parser DiskResponse) -> Value -> Parser DiskResponse)
-> (Object -> Parser DiskResponse) -> Value -> Parser DiskResponse
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    Maybe String
-> Maybe String
-> Maybe [DiskItem]
-> Maybe String
-> Maybe String
-> Maybe Warning
-> DiskResponse
DiskResponse
      (Maybe String
 -> Maybe String
 -> Maybe [DiskItem]
 -> Maybe String
 -> Maybe String
 -> Maybe Warning
 -> DiskResponse)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe [DiskItem]
      -> Maybe String
      -> Maybe String
      -> Maybe Warning
      -> DiskResponse)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"kind"
      Parser
  (Maybe String
   -> Maybe [DiskItem]
   -> Maybe String
   -> Maybe String
   -> Maybe Warning
   -> DiskResponse)
-> Parser (Maybe String)
-> Parser
     (Maybe [DiskItem]
      -> Maybe String -> Maybe String -> Maybe Warning -> DiskResponse)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"id"
      Parser
  (Maybe [DiskItem]
   -> Maybe String -> Maybe String -> Maybe Warning -> DiskResponse)
-> Parser (Maybe [DiskItem])
-> Parser
     (Maybe String -> Maybe String -> Maybe Warning -> DiskResponse)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe [DiskItem])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"items"
      Parser
  (Maybe String -> Maybe String -> Maybe Warning -> DiskResponse)
-> Parser (Maybe String)
-> Parser (Maybe String -> Maybe Warning -> DiskResponse)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"nextPageToken"
      Parser (Maybe String -> Maybe Warning -> DiskResponse)
-> Parser (Maybe String) -> Parser (Maybe Warning -> DiskResponse)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"selfLink"
      Parser (Maybe Warning -> DiskResponse)
-> Parser (Maybe Warning) -> Parser DiskResponse
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe Warning)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"warning"

instance ToJSON DiskResponse where
  toJSON :: DiskResponse -> Value
toJSON (DiskResponse Maybe String
kind Maybe String
id_ Maybe [DiskItem]
items Maybe String
nextPageToken Maybe String
selfLink Maybe Warning
warning) =
    [Pair] -> Value
object
      [ Key
"kind" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
kind
      , Key
"id" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
id_
      , Key
"items" Key -> Maybe [DiskItem] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [DiskItem]
items
      , Key
"nextPageToken" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
nextPageToken
      , Key
"selfLink" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
selfLink
      , Key
"warning" Key -> Maybe Warning -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Warning
warning
      ]

instance FromJSON ErrorDetail where
  parseJSON :: Value -> Parser ErrorDetail
parseJSON = String
-> (Object -> Parser ErrorDetail) -> Value -> Parser ErrorDetail
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ErrorDetail" ((Object -> Parser ErrorDetail) -> Value -> Parser ErrorDetail)
-> (Object -> Parser ErrorDetail) -> Value -> Parser ErrorDetail
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    String -> String -> Maybe String -> ErrorDetail
ErrorDetail
      (String -> String -> Maybe String -> ErrorDetail)
-> Parser String -> Parser (String -> Maybe String -> ErrorDetail)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"code"
      Parser (String -> Maybe String -> ErrorDetail)
-> Parser String -> Parser (Maybe String -> ErrorDetail)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"message"
      Parser (Maybe String -> ErrorDetail)
-> Parser (Maybe String) -> Parser ErrorDetail
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"location"

instance ToJSON ErrorDetail where
  toJSON :: ErrorDetail -> Value
toJSON (ErrorDetail String
code String
message Maybe String
location) =
    [Pair] -> Value
object
      [ Key
"code" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
code
      , Key
"message" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
message
      , Key
"location" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
location
      ]

instance FromJSON OperationError where
  parseJSON :: Value -> Parser OperationError
parseJSON = String
-> (Object -> Parser OperationError)
-> Value
-> Parser OperationError
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"OperationError" ((Object -> Parser OperationError)
 -> Value -> Parser OperationError)
-> (Object -> Parser OperationError)
-> Value
-> Parser OperationError
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    [ErrorDetail] -> OperationError
OperationError
      ([ErrorDetail] -> OperationError)
-> Parser [ErrorDetail] -> Parser OperationError
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser [ErrorDetail]
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"errors"

instance ToJSON OperationError where
  toJSON :: OperationError -> Value
toJSON (OperationError [ErrorDetail]
errors) =
    [Pair] -> Value
object
      [ Key
"errors" Key -> [ErrorDetail] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [ErrorDetail]
errors
      ]

instance FromJSON Operation where
  parseJSON :: Value -> Parser CreateSnapshotResp
parseJSON = String
-> (Object -> Parser CreateSnapshotResp)
-> Value
-> Parser CreateSnapshotResp
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Operation" ((Object -> Parser CreateSnapshotResp)
 -> Value -> Parser CreateSnapshotResp)
-> (Object -> Parser CreateSnapshotResp)
-> Value
-> Parser CreateSnapshotResp
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe Int
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe OperationError
-> Maybe [Warning]
-> Maybe String
-> CreateSnapshotResp
Operation
      (Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe Int
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe OperationError
 -> Maybe [Warning]
 -> Maybe String
 -> CreateSnapshotResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe Int
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateSnapshotResp)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"id"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe Int
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe OperationError
   -> Maybe [Warning]
   -> Maybe String
   -> CreateSnapshotResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe Int
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateSnapshotResp)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"name"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe Int
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe OperationError
   -> Maybe [Warning]
   -> Maybe String
   -> CreateSnapshotResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe Int
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateSnapshotResp)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"zone"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe Int
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe OperationError
   -> Maybe [Warning]
   -> Maybe String
   -> CreateSnapshotResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe Int
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateSnapshotResp)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"operationType"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe Int
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe OperationError
   -> Maybe [Warning]
   -> Maybe String
   -> CreateSnapshotResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe Int
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateSnapshotResp)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"targetLink"
      Parser
  (Maybe String
   -> Maybe Int
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe OperationError
   -> Maybe [Warning]
   -> Maybe String
   -> CreateSnapshotResp)
-> Parser (Maybe String)
-> Parser
     (Maybe Int
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateSnapshotResp)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"status"
      Parser
  (Maybe Int
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe OperationError
   -> Maybe [Warning]
   -> Maybe String
   -> CreateSnapshotResp)
-> Parser (Maybe Int)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateSnapshotResp)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe Int)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"progress"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe OperationError
   -> Maybe [Warning]
   -> Maybe String
   -> CreateSnapshotResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateSnapshotResp)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"insertTime"
      Parser
  (Maybe String
   -> Maybe String
   -> Maybe OperationError
   -> Maybe [Warning]
   -> Maybe String
   -> CreateSnapshotResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateSnapshotResp)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"startTime"
      Parser
  (Maybe String
   -> Maybe OperationError
   -> Maybe [Warning]
   -> Maybe String
   -> CreateSnapshotResp)
-> Parser (Maybe String)
-> Parser
     (Maybe OperationError
      -> Maybe [Warning] -> Maybe String -> CreateSnapshotResp)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"endTime"
      Parser
  (Maybe OperationError
   -> Maybe [Warning] -> Maybe String -> CreateSnapshotResp)
-> Parser (Maybe OperationError)
-> Parser (Maybe [Warning] -> Maybe String -> CreateSnapshotResp)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe OperationError)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"error"
      Parser (Maybe [Warning] -> Maybe String -> CreateSnapshotResp)
-> Parser (Maybe [Warning])
-> Parser (Maybe String -> CreateSnapshotResp)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe [Warning])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"warnings"
      Parser (Maybe String -> CreateSnapshotResp)
-> Parser (Maybe String) -> Parser CreateSnapshotResp
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"selfLink"

instance ToJSON Operation where
  toJSON :: CreateSnapshotResp -> Value
toJSON
    ( Operation
        Maybe String
id_
        Maybe String
name
        Maybe String
zone
        Maybe String
operationType
        Maybe String
targetLink
        Maybe String
status
        Maybe Int
progress
        Maybe String
insertTime
        Maybe String
startTime
        Maybe String
endTime
        Maybe OperationError
error_
        Maybe [Warning]
warnings
        Maybe String
selfLink
      ) =
      [Pair] -> Value
object
        [ Key
"id" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
id_
        , Key
"name" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
name
        , Key
"zone" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
zone
        , Key
"operationType" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
operationType
        , Key
"targetLink" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
targetLink
        , Key
"status" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
status
        , Key
"progress" Key -> Maybe Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Int
progress
        , Key
"insertTime" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
insertTime
        , Key
"startTime" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
startTime
        , Key
"endTime" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
endTime
        , Key
"error" Key -> Maybe OperationError -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe OperationError
error_
        , Key
"warnings" Key -> Maybe [Warning] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [Warning]
warnings
        , Key
"selfLink" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
selfLink
        ]

instance ToJSON InsertDiskOps where
  toJSON :: InsertDiskOps -> Value
toJSON
    ( InsertDiskOps
        String
name
        String
sizeGb
        Maybe String
description
        Maybe String
type_
        Maybe String
sourceImage
        Maybe String
sourceSnapshot
        Maybe (Map String String)
labels
        Maybe [GuestOsFeature]
guestOsFeatures
        Maybe EncryptionKey
diskEncryptionKey
      ) =
      [Pair] -> Value
object
        [ Key
"name" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
name
        , Key
"sizeGb" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
sizeGb
        , Key
"description" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
description
        , Key
"type" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
type_
        , Key
"sourceImage" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
sourceImage
        , Key
"sourceSnapshot" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
sourceSnapshot
        , Key
"labels" Key -> Maybe (Map String String) -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe (Map String String)
labels
        , Key
"guestOsFeatures" Key -> Maybe [GuestOsFeature] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [GuestOsFeature]
guestOsFeatures
        , Key
"diskEncryptionKey" Key -> Maybe EncryptionKey -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe EncryptionKey
diskEncryptionKey
        ]

instance ToJSON CreateSnapshotOps where
  toJSON :: CreateSnapshotOps -> Value
toJSON (CreateSnapshotOps String
name Maybe String
description Maybe (Map String String)
labels Maybe [String]
storageLocations Maybe EncryptionKey
snapshotEncryptionKey) =
    [Pair] -> Value
object
      [ Key
"name" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
name
      , Key
"description" Key -> Maybe String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe String
description
      , Key
"labels" Key -> Maybe (Map String String) -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe (Map String String)
labels
      , Key
"storageLocations" Key -> Maybe [String] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [String]
storageLocations
      , Key
"snapshotEncryptionKey" Key -> Maybe EncryptionKey -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe EncryptionKey
snapshotEncryptionKey
      ]

-- Functions
-- | List disks in a zone
--
-- Example:
--
-- > listDisks "my-project" "us-central1-a" Nothing
listDisks :: String               -- ^ GCP Project ID
          -> String               -- ^ Zone name
          -> Maybe ListDisksQuery -- ^ Optional query parameters
          -> IO (Either String DiskResponse) -- ^ List result or error}
listDisks :: String
-> String
-> Maybe ListDisksQuery
-> IO (Either String DiskResponse)
listDisks String
project String
zone_ Maybe ListDisksQuery
mbQuery = do
  let queryParams :: [QueryItem]
queryParams = [QueryItem]
-> (ListDisksQuery -> [QueryItem])
-> Maybe ListDisksQuery
-> [QueryItem]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ListDisksQuery -> [QueryItem]
queryToList Maybe ListDisksQuery
mbQuery
  RequestOptions -> IO (Either String DiskResponse)
forall b. FromJSON b => RequestOptions -> IO (Either String b)
doRequestJSON
    RequestOptions
      { reqMethod :: RequestMethod
reqMethod = RequestMethod
GET
      , reqUrl :: String
reqUrl = String
googleComputeUrl
      , mbQueryParams :: Maybe [QueryItem]
mbQueryParams = [QueryItem] -> Maybe [QueryItem]
forall a. a -> Maybe a
Just [QueryItem]
queryParams
      , mbReqBody :: Maybe ByteString
mbReqBody = Maybe ByteString
forall a. Maybe a
Nothing
      , mbReqHeaders :: Maybe RequestHeaders
mbReqHeaders = Maybe RequestHeaders
forall a. Maybe a
Nothing
      , mbReqPath :: Maybe String
mbReqPath = String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"/projects/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
project String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"/zones/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
zone_ String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"/disks"
      }
  where
    queryToList :: ListDisksQuery -> Query
    queryToList :: ListDisksQuery -> [QueryItem]
queryToList ListDisksQuery {Maybe Int
Maybe String
$sel:filter_:ListDisksQuery :: ListDisksQuery -> Maybe String
$sel:maxResults:ListDisksQuery :: ListDisksQuery -> Maybe Int
$sel:pageToken:ListDisksQuery :: ListDisksQuery -> Maybe String
$sel:orderBy:ListDisksQuery :: ListDisksQuery -> Maybe String
filter_ :: Maybe String
maxResults :: Maybe Int
pageToken :: Maybe String
orderBy :: Maybe String
..} =
      [ QueryItem -> (String -> QueryItem) -> Maybe String -> QueryItem
forall b a. b -> (a -> b) -> Maybe a -> b
maybe QueryItem
forall a. Monoid a => a
mempty (\String
x -> (ByteString
"filter", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ String -> ByteString
BS.pack String
x)) Maybe String
filter_
      , QueryItem -> (Int -> QueryItem) -> Maybe Int -> QueryItem
forall b a. b -> (a -> b) -> Maybe a -> b
maybe QueryItem
forall a. Monoid a => a
mempty (\Int
x -> (ByteString
"maxResults", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> (String -> ByteString) -> String -> Maybe ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
BS.pack (String -> Maybe ByteString) -> String -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
x)) Maybe Int
maxResults
      , QueryItem -> (String -> QueryItem) -> Maybe String -> QueryItem
forall b a. b -> (a -> b) -> Maybe a -> b
maybe QueryItem
forall a. Monoid a => a
mempty (\String
x -> (ByteString
"pageToken", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ String -> ByteString
BS.pack String
x)) Maybe String
pageToken
      , QueryItem -> (String -> QueryItem) -> Maybe String -> QueryItem
forall b a. b -> (a -> b) -> Maybe a -> b
maybe QueryItem
forall a. Monoid a => a
mempty (\String
x -> (ByteString
"orderBy", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ String -> ByteString
BS.pack String
x)) Maybe String
orderBy
      ]

-- | Create a new persistent disk
--
-- Example:
--
-- > insertDisk "my-project" "us-central1-a" (defaultInsertOps "disk1" "100") Nothing
insertDisk :: String               -- ^ GCP Project ID
           -> String               -- ^ Zone name
           -> InsertDiskOps        -- ^ Disk configuration
           -> Maybe InsertDiskQuery -- ^ Optional query parameters
           -> IO (Either String InsertDiskResponse) -- ^ Operation or error}
insertDisk :: String
-> String
-> InsertDiskOps
-> Maybe InsertDiskQuery
-> IO (Either String CreateSnapshotResp)
insertDisk String
project String
zone_ InsertDiskOps
insertDiskOps Maybe InsertDiskQuery
mbQuery = do
  let queryParams :: [QueryItem]
queryParams = [QueryItem]
-> (InsertDiskQuery -> [QueryItem])
-> Maybe InsertDiskQuery
-> [QueryItem]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] InsertDiskQuery -> [QueryItem]
queryToList Maybe InsertDiskQuery
mbQuery
  RequestOptions -> IO (Either String CreateSnapshotResp)
forall b. FromJSON b => RequestOptions -> IO (Either String b)
doRequestJSON
    RequestOptions
      { reqMethod :: RequestMethod
reqMethod = RequestMethod
POST
      , reqUrl :: String
reqUrl = String
googleComputeUrl
      , mbQueryParams :: Maybe [QueryItem]
mbQueryParams = [QueryItem] -> Maybe [QueryItem]
forall a. a -> Maybe a
Just [QueryItem]
queryParams
      , mbReqBody :: Maybe ByteString
mbReqBody = ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ InsertDiskOps -> ByteString
forall a. ToJSON a => a -> ByteString
encode InsertDiskOps
insertDiskOps
      , mbReqHeaders :: Maybe RequestHeaders
mbReqHeaders = Maybe RequestHeaders
forall a. Maybe a
Nothing
      , mbReqPath :: Maybe String
mbReqPath = String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"/projects/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
project String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"/zones/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
zone_ String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"/disks"
      }
  where
    queryToList :: InsertDiskQuery -> Query
    queryToList :: InsertDiskQuery -> [QueryItem]
queryToList InsertDiskQuery {Maybe String
$sel:sourceImage:InsertDiskQuery :: InsertDiskQuery -> Maybe String
sourceImage :: Maybe String
sourceImage, Maybe EncryptionKey
$sel:sourceImageEncryptionKey:InsertDiskQuery :: InsertDiskQuery -> Maybe EncryptionKey
sourceImageEncryptionKey :: Maybe EncryptionKey
sourceImageEncryptionKey} =
      [ QueryItem -> (String -> QueryItem) -> Maybe String -> QueryItem
forall b a. b -> (a -> b) -> Maybe a -> b
maybe QueryItem
forall a. Monoid a => a
mempty (\String
x -> (ByteString
"sourceImage", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ String -> ByteString
BS.pack String
x)) Maybe String
sourceImage
      , QueryItem
-> (EncryptionKey -> QueryItem) -> Maybe EncryptionKey -> QueryItem
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
          QueryItem
forall a. Monoid a => a
mempty
          (\EncryptionKey
x -> (ByteString
"sourceImageEncryptionKey", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> (ByteString -> ByteString) -> ByteString -> Maybe ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
BS.toStrict (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ EncryptionKey -> ByteString
forall a. ToJSON a => a -> ByteString
encode EncryptionKey
x))
          Maybe EncryptionKey
sourceImageEncryptionKey
      ]

-- | Deletes a disk with optional query parameters

-- | Delete a persistent disk
--
-- Example:
--
-- > deleteDisk "my-project" "us-central1-a" "old-disk" (Just DeleteDiskQuery { force = True })
deleteDisk :: String               -- ^ GCP Project ID
           -> String               -- ^ Zone name
           -> String               -- ^ Disk name to delete
           -> Maybe DeleteDiskQuery -- ^ Optional force deletion
           -> IO (Either String Operation) -- ^ Operation or error
deleteDisk :: String
-> String
-> String
-> Maybe DeleteDiskQuery
-> IO (Either String CreateSnapshotResp)
deleteDisk String
project String
zone_ String
diskName Maybe DeleteDiskQuery
mbQuery = do
  let queryParams :: [QueryItem]
queryParams = [QueryItem]
-> (DeleteDiskQuery -> [QueryItem])
-> Maybe DeleteDiskQuery
-> [QueryItem]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] DeleteDiskQuery -> [QueryItem]
queryToList Maybe DeleteDiskQuery
mbQuery
  RequestOptions -> IO (Either String CreateSnapshotResp)
forall b. FromJSON b => RequestOptions -> IO (Either String b)
doRequestJSON
    RequestOptions
      { reqMethod :: RequestMethod
reqMethod = RequestMethod
DELETE
      , reqUrl :: String
reqUrl = String
googleComputeUrl
      , mbQueryParams :: Maybe [QueryItem]
mbQueryParams = [QueryItem] -> Maybe [QueryItem]
forall a. a -> Maybe a
Just [QueryItem]
queryParams
      , mbReqBody :: Maybe ByteString
mbReqBody = Maybe ByteString
forall a. Maybe a
Nothing
      , mbReqHeaders :: Maybe RequestHeaders
mbReqHeaders = Maybe RequestHeaders
forall a. Maybe a
Nothing
      , mbReqPath :: Maybe String
mbReqPath = String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"/projects/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
project String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"/zones/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
zone_ String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"/disks/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
diskName
      }
  where
    queryToList :: DeleteDiskQuery -> Query
    queryToList :: DeleteDiskQuery -> [QueryItem]
queryToList DeleteDiskQuery
q =
      [ QueryItem -> (Bool -> QueryItem) -> Maybe Bool -> QueryItem
forall b a. b -> (a -> b) -> Maybe a -> b
maybe QueryItem
forall a. Monoid a => a
mempty (\Bool
x -> (ByteString
"force", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> (String -> ByteString) -> String -> Maybe ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
BS.pack (String -> Maybe ByteString) -> String -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ Bool -> String
forall a. Show a => a -> String
show Bool
x)) (DeleteDiskQuery -> Maybe Bool
force DeleteDiskQuery
q)
      ]

-- | Creates a snapshot of a disk with optional query parameters
-- | Create disk snapshot
--
-- Example:
--
-- > createDiskSnapshot "my-project" "us-central1-a" "source-disk" 
-- >   (defaultCreateSnapshotOps "daily-backup") Nothing
createDiskSnapshot :: String               -- ^ GCP Project ID
                   -> String               -- ^ Zone name
                   -> String               -- ^ Source disk name
                   -> CreateSnapshotOps    -- ^ Snapshot configuration
                   -> Maybe CreateSnapshotQuery -- ^ Optional guest flush
                   -> IO (Either String CreateSnapshotResp) -- ^ Operation or error
createDiskSnapshot :: String
-> String
-> String
-> CreateSnapshotOps
-> Maybe CreateSnapshotQuery
-> IO (Either String CreateSnapshotResp)
createDiskSnapshot String
project String
zone_ String
diskName CreateSnapshotOps
createSnapshotOps Maybe CreateSnapshotQuery
mbQuery = do
  let queryParams :: [QueryItem]
queryParams = [QueryItem]
-> (CreateSnapshotQuery -> [QueryItem])
-> Maybe CreateSnapshotQuery
-> [QueryItem]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] CreateSnapshotQuery -> [QueryItem]
queryToList Maybe CreateSnapshotQuery
mbQuery
  RequestOptions -> IO (Either String CreateSnapshotResp)
forall b. FromJSON b => RequestOptions -> IO (Either String b)
doRequestJSON
    RequestOptions
      { reqMethod :: RequestMethod
reqMethod = RequestMethod
POST
      , reqUrl :: String
reqUrl = String
googleComputeUrl
      , mbQueryParams :: Maybe [QueryItem]
mbQueryParams = [QueryItem] -> Maybe [QueryItem]
forall a. a -> Maybe a
Just [QueryItem]
queryParams
      , mbReqBody :: Maybe ByteString
mbReqBody = ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ CreateSnapshotOps -> ByteString
forall a. ToJSON a => a -> ByteString
encode CreateSnapshotOps
createSnapshotOps
      , mbReqHeaders :: Maybe RequestHeaders
mbReqHeaders = Maybe RequestHeaders
forall a. Maybe a
Nothing
      , mbReqPath :: Maybe String
mbReqPath =
          String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
"/projects/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
project String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"/zones/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
zone_ String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"/disks/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
diskName String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"/createSnapshot"
      }
  where
    queryToList :: CreateSnapshotQuery -> Query
    queryToList :: CreateSnapshotQuery -> [QueryItem]
queryToList CreateSnapshotQuery
q =
      [ QueryItem -> (Bool -> QueryItem) -> Maybe Bool -> QueryItem
forall b a. b -> (a -> b) -> Maybe a -> b
maybe QueryItem
forall a. Monoid a => a
mempty (\Bool
x -> (ByteString
"guestFlush", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> (String -> ByteString) -> String -> Maybe ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
BS.pack (String -> Maybe ByteString) -> String -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ Bool -> String
forall a. Show a => a -> String
show Bool
x)) (CreateSnapshotQuery -> Maybe Bool
guestFlush CreateSnapshotQuery
q)
      ]

-- | Default disk creation options
--
-- Creates minimal valid configuration with required name and size.
-- Other fields can be added using record update syntax:
--
-- > defaultInsertOps "new-disk" "50" { type_ = Just "pd-ssd" }
defaultInsertOps :: String -> String -> InsertDiskOps
defaultInsertOps :: String -> String -> InsertDiskOps
defaultInsertOps String
diskName String
diskSizeGb =
  InsertDiskOps
    { $sel:name:InsertDiskOps :: String
name = String
diskName
    , $sel:sizeGb:InsertDiskOps :: String
sizeGb = String
diskSizeGb
    , $sel:description:InsertDiskOps :: Maybe String
description = Maybe String
forall a. Maybe a
Nothing
    , $sel:type_:InsertDiskOps :: Maybe String
type_ = Maybe String
forall a. Maybe a
Nothing
    , $sel:sourceImage:InsertDiskOps :: Maybe String
sourceImage = Maybe String
forall a. Maybe a
Nothing
    , $sel:sourceSnapshot:InsertDiskOps :: Maybe String
sourceSnapshot = Maybe String
forall a. Maybe a
Nothing
    , $sel:labels:InsertDiskOps :: Maybe (Map String String)
labels = Maybe (Map String String)
forall a. Maybe a
Nothing
    , $sel:guestOsFeatures:InsertDiskOps :: Maybe [GuestOsFeature]
guestOsFeatures = Maybe [GuestOsFeature]
forall a. Maybe a
Nothing
    , $sel:diskEncryptionKey:InsertDiskOps :: Maybe EncryptionKey
diskEncryptionKey = Maybe EncryptionKey
forall a. Maybe a
Nothing
    }

-- | Default snapshot creation options
--
-- Creates minimal valid configuration with required snapshot name.
-- Additional fields can be added using record update syntax:
--
-- > defaultCreateSnapshotOps "backup" { description = Just "Daily backup" }
defaultCreateSnapshotOps :: String -> CreateSnapshotOps
defaultCreateSnapshotOps :: String -> CreateSnapshotOps
defaultCreateSnapshotOps String
snapshotName =
  CreateSnapshotOps
    { $sel:name:CreateSnapshotOps :: String
name = String
snapshotName
    , $sel:description:CreateSnapshotOps :: Maybe String
description = Maybe String
forall a. Maybe a
Nothing
    , $sel:labels:CreateSnapshotOps :: Maybe (Map String String)
labels = Maybe (Map String String)
forall a. Maybe a
Nothing
    , $sel:storageLocations:CreateSnapshotOps :: Maybe [String]
storageLocations = Maybe [String]
forall a. Maybe a
Nothing
    , $sel:snapshotEncryptionKey:CreateSnapshotOps :: Maybe EncryptionKey
snapshotEncryptionKey = Maybe EncryptionKey
forall a. Maybe a
Nothing
    }