{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TupleSections #-}

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

This module provides a Haskell client for Google Cloud Compute Engine Firewall operations.
-}
module Google.Cloud.Compute.Firewall
  ( listFirewalls
  , FirewallList (..)
  , FirewallMeta (..)
  , AllowedFirewall (..)
  , createFirewall
  , CreateFirewallOps (..)
  , CreateFirewallResp
  , Operation (..)
  , Warning (..)
  , WarningData (..)
  , LogConfig (..)
  , DeniedFirewall (..)
  , defaultCreateFirewallOps
  ) where

import Data.Aeson
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as BS8
import Data.Maybe
import Google.Cloud.Common.Core
import Google.Cloud.Compute.Common

-- | Represents a warning object in API responses
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 firewall listing operations
data FirewallList = FirewallList
  { FirewallList -> Maybe String
kind :: Maybe String
  -- ^ Type identifier ("compute#firewallList")
  , FirewallList -> Maybe String
id :: Maybe String
  -- ^ Unique identifier for the resource
  , FirewallList -> Maybe [FirewallMeta]
items :: Maybe [FirewallMeta]
  -- ^ List of firewall rules
  , FirewallList -> Maybe String
nextPageToken :: Maybe String
  -- ^ Pagination token for next page
  , FirewallList -> Maybe String
selfLink :: Maybe String
  -- ^ Server-defined URL for the resource
  , FirewallList -> Maybe Warning
warning :: Maybe Warning
  -- ^ Any warnings about the result
  }
  deriving (Int -> FirewallList -> ShowS
[FirewallList] -> ShowS
FirewallList -> String
(Int -> FirewallList -> ShowS)
-> (FirewallList -> String)
-> ([FirewallList] -> ShowS)
-> Show FirewallList
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FirewallList -> ShowS
showsPrec :: Int -> FirewallList -> ShowS
$cshow :: FirewallList -> String
show :: FirewallList -> String
$cshowList :: [FirewallList] -> ShowS
showList :: [FirewallList] -> ShowS
Show, FirewallList -> FirewallList -> Bool
(FirewallList -> FirewallList -> Bool)
-> (FirewallList -> FirewallList -> Bool) -> Eq FirewallList
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FirewallList -> FirewallList -> Bool
== :: FirewallList -> FirewallList -> Bool
$c/= :: FirewallList -> FirewallList -> Bool
/= :: FirewallList -> FirewallList -> Bool
Eq)

-- | Represents a Google Cloud Firewall Rule
data FirewallMeta = FirewallMeta
  { FirewallMeta -> Maybe String
kind :: Maybe String
  -- ^ Type identifier ("compute#firewall")
  , FirewallMeta -> Maybe String
id :: Maybe String
  -- ^ Unique numeric ID
  , FirewallMeta -> Maybe String
creationTimestamp :: Maybe String
  -- ^ ISO 8601 creation timestamp
  , FirewallMeta -> Maybe String
name :: Maybe String
  -- ^ User-provided firewall name
  , FirewallMeta -> Maybe String
description :: Maybe String
  -- ^ Optional rule description
  , FirewallMeta -> Maybe String
network :: Maybe String
  -- ^ Network URL the rule applies to
  , FirewallMeta -> Maybe Int
priority :: Maybe Int
  -- ^ Rule priority (0-65535, lower=higher)
  , FirewallMeta -> Maybe [String]
sourceRanges :: Maybe [String]
  -- ^ Allowed source IP ranges (CIDR)
  , FirewallMeta -> Maybe [String]
sourceTags :: Maybe [String]
  -- ^ Source instance tags
  , FirewallMeta -> Maybe [String]
targetTags :: Maybe [String]
  -- ^ Target instance tags
  , FirewallMeta -> Maybe [AllowedFirewall]
allowed :: Maybe [AllowedFirewall]
  -- ^ Allow rules
  , FirewallMeta -> Maybe [DeniedFirewall]
denied :: Maybe [DeniedFirewall]
  -- ^ Deny rules
  , FirewallMeta -> Maybe String
direction :: Maybe String
  -- ^ Traffic direction (INGRESS/EGRESS)
  , FirewallMeta -> Maybe LogConfig
logConfig :: Maybe LogConfig
  -- ^ Logging configuration
  , FirewallMeta -> Maybe Bool
disabled :: Maybe Bool
  -- ^ Whether rule is disabled
  , FirewallMeta -> Maybe String
selfLink :: Maybe String
  -- ^ Server-defined URL for the rule
  }
  deriving (Int -> FirewallMeta -> ShowS
[FirewallMeta] -> ShowS
FirewallMeta -> String
(Int -> FirewallMeta -> ShowS)
-> (FirewallMeta -> String)
-> ([FirewallMeta] -> ShowS)
-> Show FirewallMeta
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FirewallMeta -> ShowS
showsPrec :: Int -> FirewallMeta -> ShowS
$cshow :: FirewallMeta -> String
show :: FirewallMeta -> String
$cshowList :: [FirewallMeta] -> ShowS
showList :: [FirewallMeta] -> ShowS
Show, FirewallMeta -> FirewallMeta -> Bool
(FirewallMeta -> FirewallMeta -> Bool)
-> (FirewallMeta -> FirewallMeta -> Bool) -> Eq FirewallMeta
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FirewallMeta -> FirewallMeta -> Bool
== :: FirewallMeta -> FirewallMeta -> Bool
$c/= :: FirewallMeta -> FirewallMeta -> Bool
/= :: FirewallMeta -> FirewallMeta -> Bool
Eq)

-- | Allow rule specification
data AllowedFirewall = AllowedFirewall
  { AllowedFirewall -> String
iPProtocol :: String
  -- ^ Protocol name (e.g., "tcp", "udp", "icmp")
  , AllowedFirewall -> Maybe [String]
ports :: Maybe [String]
  -- ^ Optional port numbers/ranges (e.g., "80", "8000-8080")
  }
  deriving (Int -> AllowedFirewall -> ShowS
[AllowedFirewall] -> ShowS
AllowedFirewall -> String
(Int -> AllowedFirewall -> ShowS)
-> (AllowedFirewall -> String)
-> ([AllowedFirewall] -> ShowS)
-> Show AllowedFirewall
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AllowedFirewall -> ShowS
showsPrec :: Int -> AllowedFirewall -> ShowS
$cshow :: AllowedFirewall -> String
show :: AllowedFirewall -> String
$cshowList :: [AllowedFirewall] -> ShowS
showList :: [AllowedFirewall] -> ShowS
Show, AllowedFirewall -> AllowedFirewall -> Bool
(AllowedFirewall -> AllowedFirewall -> Bool)
-> (AllowedFirewall -> AllowedFirewall -> Bool)
-> Eq AllowedFirewall
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AllowedFirewall -> AllowedFirewall -> Bool
== :: AllowedFirewall -> AllowedFirewall -> Bool
$c/= :: AllowedFirewall -> AllowedFirewall -> Bool
/= :: AllowedFirewall -> AllowedFirewall -> Bool
Eq)

-- | Deny rule specification
data DeniedFirewall = DeniedFirewall
  { DeniedFirewall -> String
iPProtocol :: String
  -- ^ Protocol name (e.g., "tcp", "udp")
  , DeniedFirewall -> Maybe [String]
ports :: Maybe [String]
  -- ^ Optional port numbers/ranges to block
  }
  deriving (Int -> DeniedFirewall -> ShowS
[DeniedFirewall] -> ShowS
DeniedFirewall -> String
(Int -> DeniedFirewall -> ShowS)
-> (DeniedFirewall -> String)
-> ([DeniedFirewall] -> ShowS)
-> Show DeniedFirewall
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DeniedFirewall -> ShowS
showsPrec :: Int -> DeniedFirewall -> ShowS
$cshow :: DeniedFirewall -> String
show :: DeniedFirewall -> String
$cshowList :: [DeniedFirewall] -> ShowS
showList :: [DeniedFirewall] -> ShowS
Show, DeniedFirewall -> DeniedFirewall -> Bool
(DeniedFirewall -> DeniedFirewall -> Bool)
-> (DeniedFirewall -> DeniedFirewall -> Bool) -> Eq DeniedFirewall
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DeniedFirewall -> DeniedFirewall -> Bool
== :: DeniedFirewall -> DeniedFirewall -> Bool
$c/= :: DeniedFirewall -> DeniedFirewall -> Bool
/= :: DeniedFirewall -> DeniedFirewall -> Bool
Eq)

-- | Firewall rule logging configuration
data LogConfig = LogConfig
  { LogConfig -> Bool
enable :: Bool
  -- ^ Whether to enable logging
  , LogConfig -> Maybe String
metadata :: Maybe String
  -- ^ Log metadata level (EXCLUDE_ALL_METADATA or INCLUDE_ALL_METADATA)
  }
  deriving (Int -> LogConfig -> ShowS
[LogConfig] -> ShowS
LogConfig -> String
(Int -> LogConfig -> ShowS)
-> (LogConfig -> String)
-> ([LogConfig] -> ShowS)
-> Show LogConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LogConfig -> ShowS
showsPrec :: Int -> LogConfig -> ShowS
$cshow :: LogConfig -> String
show :: LogConfig -> String
$cshowList :: [LogConfig] -> ShowS
showList :: [LogConfig] -> ShowS
Show, LogConfig -> LogConfig -> Bool
(LogConfig -> LogConfig -> Bool)
-> (LogConfig -> LogConfig -> Bool) -> Eq LogConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LogConfig -> LogConfig -> Bool
== :: LogConfig -> LogConfig -> Bool
$c/= :: LogConfig -> LogConfig -> Bool
/= :: LogConfig -> LogConfig -> Bool
Eq)

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

-- | Firewall creation options
data CreateFirewallOps = CreateFirewallOps
  { CreateFirewallOps -> String
name :: String
  -- ^ Required firewall rule name
  , CreateFirewallOps -> Maybe String
description :: Maybe String
  -- ^ Optional description
  , CreateFirewallOps -> Maybe String
network :: Maybe String
  -- ^ Network URL (default: "global/networks/default")
  , CreateFirewallOps -> Maybe Int
priority :: Maybe Int
  -- ^ Priority (default: 1000)
  , CreateFirewallOps -> Maybe [String]
sourceRanges :: Maybe [String]
  -- ^ Source IP ranges (CIDR format)
  , CreateFirewallOps -> Maybe [String]
sourceTags :: Maybe [String]
  -- ^ Source instance tags
  , CreateFirewallOps -> Maybe [String]
targetTags :: Maybe [String]
  -- ^ Target instance tags
  , CreateFirewallOps -> Maybe [AllowedFirewall]
allowed :: Maybe [AllowedFirewall]
  -- ^ Traffic allow rules
  , CreateFirewallOps -> Maybe [DeniedFirewall]
denied :: Maybe [DeniedFirewall]
  -- ^ Traffic deny rules
  , CreateFirewallOps -> Maybe String
direction :: Maybe String
  -- ^ Traffic direction (default: INGRESS)
  , CreateFirewallOps -> Maybe LogConfig
logConfig :: Maybe LogConfig
  -- ^ Logging configuration
  , CreateFirewallOps -> Maybe Bool
disabled :: Maybe Bool
  -- ^ Initial disabled state (default: False)
  }
  deriving (Int -> CreateFirewallOps -> ShowS
[CreateFirewallOps] -> ShowS
CreateFirewallOps -> String
(Int -> CreateFirewallOps -> ShowS)
-> (CreateFirewallOps -> String)
-> ([CreateFirewallOps] -> ShowS)
-> Show CreateFirewallOps
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CreateFirewallOps -> ShowS
showsPrec :: Int -> CreateFirewallOps -> ShowS
$cshow :: CreateFirewallOps -> String
show :: CreateFirewallOps -> String
$cshowList :: [CreateFirewallOps] -> ShowS
showList :: [CreateFirewallOps] -> ShowS
Show, CreateFirewallOps -> CreateFirewallOps -> Bool
(CreateFirewallOps -> CreateFirewallOps -> Bool)
-> (CreateFirewallOps -> CreateFirewallOps -> Bool)
-> Eq CreateFirewallOps
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CreateFirewallOps -> CreateFirewallOps -> Bool
== :: CreateFirewallOps -> CreateFirewallOps -> Bool
$c/= :: CreateFirewallOps -> CreateFirewallOps -> Bool
/= :: CreateFirewallOps -> CreateFirewallOps -> Bool
Eq)

-- | Alias for operation response from firewall creation
type CreateFirewallResp = Operation

-- 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
k String
v) =
    [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
k
      , 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
v
      ]

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
c String
m Maybe [WarningData]
d) =
    [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
c
      , 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
m
      , 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]
d
      ]

instance FromJSON LogConfig where
  parseJSON :: Value -> Parser LogConfig
parseJSON = String -> (Object -> Parser LogConfig) -> Value -> Parser LogConfig
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"LogConfig" ((Object -> Parser LogConfig) -> Value -> Parser LogConfig)
-> (Object -> Parser LogConfig) -> Value -> Parser LogConfig
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    Bool -> Maybe String -> LogConfig
LogConfig
      (Bool -> Maybe String -> LogConfig)
-> Parser Bool -> Parser (Maybe String -> LogConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"enable"
      Parser (Maybe String -> LogConfig)
-> Parser (Maybe String) -> Parser LogConfig
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
"metadata"

instance ToJSON LogConfig where
  toJSON :: LogConfig -> Value
toJSON (LogConfig Bool
e Maybe String
m) =
    [Pair] -> Value
object
      [ Key
"enable" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
e
      , Key
"metadata" 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
m
      ]

instance FromJSON AllowedFirewall where
  parseJSON :: Value -> Parser AllowedFirewall
parseJSON = String
-> (Object -> Parser AllowedFirewall)
-> Value
-> Parser AllowedFirewall
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"AllowedFirewall" ((Object -> Parser AllowedFirewall)
 -> Value -> Parser AllowedFirewall)
-> (Object -> Parser AllowedFirewall)
-> Value
-> Parser AllowedFirewall
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    String -> Maybe [String] -> AllowedFirewall
AllowedFirewall
      (String -> Maybe [String] -> AllowedFirewall)
-> Parser String -> Parser (Maybe [String] -> AllowedFirewall)
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
"IPProtocol"
      Parser (Maybe [String] -> AllowedFirewall)
-> Parser (Maybe [String]) -> Parser AllowedFirewall
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
"ports"

instance ToJSON AllowedFirewall where
  toJSON :: AllowedFirewall -> Value
toJSON (AllowedFirewall String
i Maybe [String]
p) =
    [Pair] -> Value
object
      [ Key
"IPProtocol" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
i
      , Key
"ports" 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]
p
      ]

instance FromJSON DeniedFirewall where
  parseJSON :: Value -> Parser DeniedFirewall
parseJSON = String
-> (Object -> Parser DeniedFirewall)
-> Value
-> Parser DeniedFirewall
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"DeniedFirewall" ((Object -> Parser DeniedFirewall)
 -> Value -> Parser DeniedFirewall)
-> (Object -> Parser DeniedFirewall)
-> Value
-> Parser DeniedFirewall
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    String -> Maybe [String] -> DeniedFirewall
DeniedFirewall
      (String -> Maybe [String] -> DeniedFirewall)
-> Parser String -> Parser (Maybe [String] -> DeniedFirewall)
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
"IPProtocol"
      Parser (Maybe [String] -> DeniedFirewall)
-> Parser (Maybe [String]) -> Parser DeniedFirewall
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
"ports"

instance ToJSON DeniedFirewall where
  toJSON :: DeniedFirewall -> Value
toJSON (DeniedFirewall String
i Maybe [String]
p) =
    [Pair] -> Value
object
      [ Key
"IPProtocol" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String
i
      , Key
"ports" 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]
p
      ]

instance FromJSON FirewallMeta where
  parseJSON :: Value -> Parser FirewallMeta
parseJSON = String
-> (Object -> Parser FirewallMeta) -> Value -> Parser FirewallMeta
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"FirewallMeta" ((Object -> Parser FirewallMeta) -> Value -> Parser FirewallMeta)
-> (Object -> Parser FirewallMeta) -> Value -> Parser FirewallMeta
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 [AllowedFirewall]
-> Maybe [DeniedFirewall]
-> Maybe String
-> Maybe LogConfig
-> Maybe Bool
-> Maybe String
-> FirewallMeta
FirewallMeta
      (Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe Int
 -> Maybe [String]
 -> Maybe [String]
 -> Maybe [String]
 -> Maybe [AllowedFirewall]
 -> Maybe [DeniedFirewall]
 -> Maybe String
 -> Maybe LogConfig
 -> Maybe Bool
 -> Maybe String
 -> FirewallMeta)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe Int
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [AllowedFirewall]
      -> Maybe [DeniedFirewall]
      -> Maybe String
      -> Maybe LogConfig
      -> Maybe Bool
      -> Maybe String
      -> FirewallMeta)
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 Int
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [AllowedFirewall]
   -> Maybe [DeniedFirewall]
   -> Maybe String
   -> Maybe LogConfig
   -> Maybe Bool
   -> Maybe String
   -> FirewallMeta)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe Int
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [AllowedFirewall]
      -> Maybe [DeniedFirewall]
      -> Maybe String
      -> Maybe LogConfig
      -> Maybe Bool
      -> Maybe String
      -> FirewallMeta)
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 Int
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [AllowedFirewall]
   -> Maybe [DeniedFirewall]
   -> Maybe String
   -> Maybe LogConfig
   -> Maybe Bool
   -> Maybe String
   -> FirewallMeta)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe Int
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [AllowedFirewall]
      -> Maybe [DeniedFirewall]
      -> Maybe String
      -> Maybe LogConfig
      -> Maybe Bool
      -> Maybe String
      -> FirewallMeta)
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 Int
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [AllowedFirewall]
   -> Maybe [DeniedFirewall]
   -> Maybe String
   -> Maybe LogConfig
   -> Maybe Bool
   -> Maybe String
   -> FirewallMeta)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe Int
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [AllowedFirewall]
      -> Maybe [DeniedFirewall]
      -> Maybe String
      -> Maybe LogConfig
      -> Maybe Bool
      -> Maybe String
      -> FirewallMeta)
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 Int
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [AllowedFirewall]
   -> Maybe [DeniedFirewall]
   -> Maybe String
   -> Maybe LogConfig
   -> Maybe Bool
   -> Maybe String
   -> FirewallMeta)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe Int
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [AllowedFirewall]
      -> Maybe [DeniedFirewall]
      -> Maybe String
      -> Maybe LogConfig
      -> Maybe Bool
      -> Maybe String
      -> FirewallMeta)
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 Int
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [AllowedFirewall]
   -> Maybe [DeniedFirewall]
   -> Maybe String
   -> Maybe LogConfig
   -> Maybe Bool
   -> Maybe String
   -> FirewallMeta)
-> Parser (Maybe String)
-> Parser
     (Maybe Int
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [AllowedFirewall]
      -> Maybe [DeniedFirewall]
      -> Maybe String
      -> Maybe LogConfig
      -> Maybe Bool
      -> Maybe String
      -> FirewallMeta)
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
"network"
      Parser
  (Maybe Int
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [AllowedFirewall]
   -> Maybe [DeniedFirewall]
   -> Maybe String
   -> Maybe LogConfig
   -> Maybe Bool
   -> Maybe String
   -> FirewallMeta)
-> Parser (Maybe Int)
-> Parser
     (Maybe [String]
      -> Maybe [String]
      -> Maybe [String]
      -> Maybe [AllowedFirewall]
      -> Maybe [DeniedFirewall]
      -> Maybe String
      -> Maybe LogConfig
      -> Maybe Bool
      -> Maybe String
      -> FirewallMeta)
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
"priority"
      Parser
  (Maybe [String]
   -> Maybe [String]
   -> Maybe [String]
   -> Maybe [AllowedFirewall]
   -> Maybe [DeniedFirewall]
   -> Maybe String
   -> Maybe LogConfig
   -> Maybe Bool
   -> Maybe String
   -> FirewallMeta)
-> Parser (Maybe [String])
-> Parser
     (Maybe [String]
      -> Maybe [String]
      -> Maybe [AllowedFirewall]
      -> Maybe [DeniedFirewall]
      -> Maybe String
      -> Maybe LogConfig
      -> Maybe Bool
      -> Maybe String
      -> FirewallMeta)
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
"sourceRanges"
      Parser
  (Maybe [String]
   -> Maybe [String]
   -> Maybe [AllowedFirewall]
   -> Maybe [DeniedFirewall]
   -> Maybe String
   -> Maybe LogConfig
   -> Maybe Bool
   -> Maybe String
   -> FirewallMeta)
-> Parser (Maybe [String])
-> Parser
     (Maybe [String]
      -> Maybe [AllowedFirewall]
      -> Maybe [DeniedFirewall]
      -> Maybe String
      -> Maybe LogConfig
      -> Maybe Bool
      -> Maybe String
      -> FirewallMeta)
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
"sourceTags"
      Parser
  (Maybe [String]
   -> Maybe [AllowedFirewall]
   -> Maybe [DeniedFirewall]
   -> Maybe String
   -> Maybe LogConfig
   -> Maybe Bool
   -> Maybe String
   -> FirewallMeta)
-> Parser (Maybe [String])
-> Parser
     (Maybe [AllowedFirewall]
      -> Maybe [DeniedFirewall]
      -> Maybe String
      -> Maybe LogConfig
      -> Maybe Bool
      -> Maybe String
      -> FirewallMeta)
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
"targetTags"
      Parser
  (Maybe [AllowedFirewall]
   -> Maybe [DeniedFirewall]
   -> Maybe String
   -> Maybe LogConfig
   -> Maybe Bool
   -> Maybe String
   -> FirewallMeta)
-> Parser (Maybe [AllowedFirewall])
-> Parser
     (Maybe [DeniedFirewall]
      -> Maybe String
      -> Maybe LogConfig
      -> Maybe Bool
      -> Maybe String
      -> FirewallMeta)
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 [AllowedFirewall])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"allowed"
      Parser
  (Maybe [DeniedFirewall]
   -> Maybe String
   -> Maybe LogConfig
   -> Maybe Bool
   -> Maybe String
   -> FirewallMeta)
-> Parser (Maybe [DeniedFirewall])
-> Parser
     (Maybe String
      -> Maybe LogConfig -> Maybe Bool -> Maybe String -> FirewallMeta)
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 [DeniedFirewall])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"denied"
      Parser
  (Maybe String
   -> Maybe LogConfig -> Maybe Bool -> Maybe String -> FirewallMeta)
-> Parser (Maybe String)
-> Parser
     (Maybe LogConfig -> Maybe Bool -> Maybe String -> FirewallMeta)
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
"direction"
      Parser
  (Maybe LogConfig -> Maybe Bool -> Maybe String -> FirewallMeta)
-> Parser (Maybe LogConfig)
-> Parser (Maybe Bool -> Maybe String -> FirewallMeta)
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 LogConfig)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"logConfig"
      Parser (Maybe Bool -> Maybe String -> FirewallMeta)
-> Parser (Maybe Bool) -> Parser (Maybe String -> FirewallMeta)
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 Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"disabled"
      Parser (Maybe String -> FirewallMeta)
-> Parser (Maybe String) -> Parser FirewallMeta
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 FirewallMeta where
  toJSON :: FirewallMeta -> Value
toJSON
    ( FirewallMeta
        Maybe String
k
        Maybe String
i
        Maybe String
c
        Maybe String
name_
        Maybe String
description_
        Maybe String
network_
        Maybe Int
priority_
        Maybe [String]
sourceRanges_
        Maybe [String]
sourceTags_
        Maybe [String]
targetTags_
        Maybe [AllowedFirewall]
allowed_
        Maybe [DeniedFirewall]
denied_
        Maybe String
direction_
        Maybe LogConfig
logConfig_
        Maybe Bool
disabled_
        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
k
        , 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
i
        , 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
c
        , 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
"network" 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
network_
        , Key
"priority" 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
priority_
        , Key
"sourceRanges" 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]
sourceRanges_
        , Key
"sourceTags" 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]
sourceTags_
        , Key
"targetTags" 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]
targetTags_
        , Key
"allowed" Key -> Maybe [AllowedFirewall] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [AllowedFirewall]
allowed_
        , Key
"denied" Key -> Maybe [DeniedFirewall] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [DeniedFirewall]
denied_
        , Key
"direction" 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
direction_
        , Key
"logConfig" Key -> Maybe LogConfig -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe LogConfig
logConfig_
        , Key
"disabled" Key -> Maybe Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Bool
disabled_
        , 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 FirewallList where
  parseJSON :: Value -> Parser FirewallList
parseJSON = String
-> (Object -> Parser FirewallList) -> Value -> Parser FirewallList
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"FirewallList" ((Object -> Parser FirewallList) -> Value -> Parser FirewallList)
-> (Object -> Parser FirewallList) -> Value -> Parser FirewallList
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    Maybe String
-> Maybe String
-> Maybe [FirewallMeta]
-> Maybe String
-> Maybe String
-> Maybe Warning
-> FirewallList
FirewallList
      (Maybe String
 -> Maybe String
 -> Maybe [FirewallMeta]
 -> Maybe String
 -> Maybe String
 -> Maybe Warning
 -> FirewallList)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe [FirewallMeta]
      -> Maybe String
      -> Maybe String
      -> Maybe Warning
      -> FirewallList)
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 [FirewallMeta]
   -> Maybe String
   -> Maybe String
   -> Maybe Warning
   -> FirewallList)
-> Parser (Maybe String)
-> Parser
     (Maybe [FirewallMeta]
      -> Maybe String -> Maybe String -> Maybe Warning -> FirewallList)
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 [FirewallMeta]
   -> Maybe String -> Maybe String -> Maybe Warning -> FirewallList)
-> Parser (Maybe [FirewallMeta])
-> Parser
     (Maybe String -> Maybe String -> Maybe Warning -> FirewallList)
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 [FirewallMeta])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"items"
      Parser
  (Maybe String -> Maybe String -> Maybe Warning -> FirewallList)
-> Parser (Maybe String)
-> Parser (Maybe String -> Maybe Warning -> FirewallList)
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 -> FirewallList)
-> Parser (Maybe String) -> Parser (Maybe Warning -> FirewallList)
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 -> FirewallList)
-> Parser (Maybe Warning) -> Parser FirewallList
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 FirewallList where
  toJSON :: FirewallList -> Value
toJSON (FirewallList Maybe String
kind_ Maybe String
id_ Maybe [FirewallMeta]
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 [FirewallMeta] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [FirewallMeta]
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 CreateFirewallResp
parseJSON = String
-> (Object -> Parser CreateFirewallResp)
-> Value
-> Parser CreateFirewallResp
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Operation" ((Object -> Parser CreateFirewallResp)
 -> Value -> Parser CreateFirewallResp)
-> (Object -> Parser CreateFirewallResp)
-> Value
-> Parser CreateFirewallResp
forall a b. (a -> b) -> a -> b
$ \Object
v ->
    Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe Int
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe OperationError
-> Maybe [Warning]
-> Maybe String
-> CreateFirewallResp
Operation
      (Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe Int
 -> Maybe String
 -> Maybe String
 -> Maybe String
 -> Maybe OperationError
 -> Maybe [Warning]
 -> Maybe String
 -> CreateFirewallResp)
-> 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
      -> CreateFirewallResp)
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 Int
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe OperationError
   -> Maybe [Warning]
   -> Maybe String
   -> CreateFirewallResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe Int
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateFirewallResp)
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 Int
   -> Maybe String
   -> Maybe String
   -> Maybe String
   -> Maybe OperationError
   -> Maybe [Warning]
   -> Maybe String
   -> CreateFirewallResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe Int
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateFirewallResp)
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
   -> CreateFirewallResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe Int
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateFirewallResp)
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
   -> CreateFirewallResp)
-> Parser (Maybe String)
-> Parser
     (Maybe Int
      -> Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateFirewallResp)
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
   -> CreateFirewallResp)
-> Parser (Maybe Int)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateFirewallResp)
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
   -> CreateFirewallResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateFirewallResp)
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
   -> CreateFirewallResp)
-> Parser (Maybe String)
-> Parser
     (Maybe String
      -> Maybe OperationError
      -> Maybe [Warning]
      -> Maybe String
      -> CreateFirewallResp)
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
   -> CreateFirewallResp)
-> Parser (Maybe String)
-> Parser
     (Maybe OperationError
      -> Maybe [Warning] -> Maybe String -> CreateFirewallResp)
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 -> CreateFirewallResp)
-> Parser (Maybe OperationError)
-> Parser (Maybe [Warning] -> Maybe String -> CreateFirewallResp)
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 -> CreateFirewallResp)
-> Parser (Maybe [Warning])
-> Parser (Maybe String -> CreateFirewallResp)
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 -> CreateFirewallResp)
-> Parser (Maybe String) -> Parser CreateFirewallResp
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 :: CreateFirewallResp -> Value
toJSON
    ( Operation
        Maybe String
id_
        Maybe String
name_
        Maybe String
operationType_
        Maybe String
targetLink_
        Maybe String
status_
        Maybe Int
progress_
        Maybe String
insertTime_
        Maybe String
startTime_
        Maybe String
endTime_
        Maybe OperationError
error1
        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
"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
error1
        , 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 CreateFirewallOps where
  toJSON :: CreateFirewallOps -> Value
toJSON
    ( CreateFirewallOps
        String
name_
        Maybe String
description_
        Maybe String
network_
        Maybe Int
priority_
        Maybe [String]
sourceRanges_
        Maybe [String]
sourceTags_
        Maybe [String]
targetTags_
        Maybe [AllowedFirewall]
allowed_
        Maybe [DeniedFirewall]
denied_
        Maybe String
direction_
        Maybe LogConfig
logConfig_
        Maybe Bool
disabled_
      ) =
      [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
"network" 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
network_
        , Key
"priority" 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
priority_
        , Key
"sourceRanges" 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]
sourceRanges_
        , Key
"sourceTags" 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]
sourceTags_
        , Key
"targetTags" 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]
targetTags_
        , Key
"allowed" Key -> Maybe [AllowedFirewall] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [AllowedFirewall]
allowed_
        , Key
"denied" Key -> Maybe [DeniedFirewall] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe [DeniedFirewall]
denied_
        , Key
"direction" 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
direction_
        , Key
"logConfig" Key -> Maybe LogConfig -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe LogConfig
logConfig_
        , Key
"disabled" Key -> Maybe Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Bool
disabled_
        ]

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

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

-- Helper function to convert query to list of (ByteString, Maybe ByteString)
queryToList :: (a -> [(String, String)]) -> a -> [(BS.ByteString, Maybe BS.ByteString)]
queryToList :: forall a.
(a -> [(String, String)]) -> a -> [(ByteString, Maybe ByteString)]
queryToList a -> [(String, String)]
f a
q = ((String, String) -> (ByteString, Maybe ByteString))
-> [(String, String)] -> [(ByteString, Maybe ByteString)]
forall a b. (a -> b) -> [a] -> [b]
map (\(String
k, String
v) -> (String -> ByteString
BS8.pack String
k, ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ String -> ByteString
BS8.pack String
v)) (a -> [(String, String)]
f a
q)

-- Functions

{- | List firewall rules in a project

Example:

> listFirewalls "my-project" (Just ListFirewallsQuery { filter0 = Just "name=default-allow-*" })
-}
listFirewalls ::
  -- | GCP Project ID
  String ->
  -- | Optional query parameters
  Maybe ListFirewallsQuery ->
  -- | List result or error
  IO (Either String FirewallList)
listFirewalls :: String
-> Maybe ListFirewallsQuery -> IO (Either String FirewallList)
listFirewalls String
project Maybe ListFirewallsQuery
mbQuery = do
  let queryParams :: [(ByteString, Maybe ByteString)]
queryParams = [(ByteString, Maybe ByteString)]
-> (ListFirewallsQuery -> [(ByteString, Maybe ByteString)])
-> Maybe ListFirewallsQuery
-> [(ByteString, Maybe ByteString)]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ((ListFirewallsQuery -> [(String, String)])
-> ListFirewallsQuery -> [(ByteString, Maybe ByteString)]
forall a.
(a -> [(String, String)]) -> a -> [(ByteString, Maybe ByteString)]
queryToList ListFirewallsQuery -> [(String, String)]
queryToListFunc) Maybe ListFirewallsQuery
mbQuery
  RequestOptions -> IO (Either String FirewallList)
forall b. FromJSON b => RequestOptions -> IO (Either String b)
doRequestJSON
    RequestOptions
      { reqMethod :: RequestMethod
reqMethod = RequestMethod
GET
      , reqUrl :: String
reqUrl = String
googleComputeUrl
      , mbQueryParams :: Maybe [(ByteString, Maybe ByteString)]
mbQueryParams = [(ByteString, Maybe ByteString)]
-> Maybe [(ByteString, Maybe ByteString)]
forall a. a -> Maybe a
Just [(ByteString, Maybe ByteString)]
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
"/global/firewalls"
      }
  where
    queryToListFunc :: ListFirewallsQuery -> [(String, String)]
    queryToListFunc :: ListFirewallsQuery -> [(String, String)]
queryToListFunc ListFirewallsQuery
q =
      [Maybe (String, String)] -> [(String, String)]
forall a. [Maybe a] -> [a]
catMaybes
        [ (String
"filter",) (String -> (String, String))
-> Maybe String -> Maybe (String, String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ListFirewallsQuery -> Maybe String
filter0 ListFirewallsQuery
q
        , (String
"maxResults",) (String -> (String, String))
-> (Int -> String) -> Int -> (String, String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String
forall a. Show a => a -> String
show (Int -> (String, String)) -> Maybe Int -> Maybe (String, String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ListFirewallsQuery -> Maybe Int
maxResults ListFirewallsQuery
q
        , (String
"pageToken",) (String -> (String, String))
-> Maybe String -> Maybe (String, String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ListFirewallsQuery -> Maybe String
pageToken ListFirewallsQuery
q
        , (String
"orderBy",) (String -> (String, String))
-> Maybe String -> Maybe (String, String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ListFirewallsQuery -> Maybe String
orderBy ListFirewallsQuery
q
        ]

{- | Create a new firewall rule

Example:

> createFirewall "my-project"
>   (defaultCreateFirewallOps "allow-http"
>     { allowed = Just [AllowedFirewall "tcp" (Just ["80"])]
>     , sourceRanges = Just ["0.0.0.0/0"]
>   }) Nothing
-}
createFirewall ::
  -- | GCP Project ID
  String ->
  -- | Firewall configuration
  CreateFirewallOps ->
  -- | Optional request ID
  Maybe CreateFirewallQuery ->
  -- | Operation or error
  IO (Either String CreateFirewallResp)
createFirewall :: String
-> CreateFirewallOps
-> Maybe CreateFirewallQuery
-> IO (Either String CreateFirewallResp)
createFirewall String
project CreateFirewallOps
createFirewallOps Maybe CreateFirewallQuery
mbQuery = do
  let queryParams :: [(ByteString, Maybe ByteString)]
queryParams = [(ByteString, Maybe ByteString)]
-> (CreateFirewallQuery -> [(ByteString, Maybe ByteString)])
-> Maybe CreateFirewallQuery
-> [(ByteString, Maybe ByteString)]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ((CreateFirewallQuery -> [(String, String)])
-> CreateFirewallQuery -> [(ByteString, Maybe ByteString)]
forall a.
(a -> [(String, String)]) -> a -> [(ByteString, Maybe ByteString)]
queryToList CreateFirewallQuery -> [(String, String)]
queryToListFunc) Maybe CreateFirewallQuery
mbQuery
  RequestOptions -> IO (Either String CreateFirewallResp)
forall b. FromJSON b => RequestOptions -> IO (Either String b)
doRequestJSON
    RequestOptions
      { reqMethod :: RequestMethod
reqMethod = RequestMethod
POST
      , reqUrl :: String
reqUrl = String
googleComputeUrl
      , mbQueryParams :: Maybe [(ByteString, Maybe ByteString)]
mbQueryParams = [(ByteString, Maybe ByteString)]
-> Maybe [(ByteString, Maybe ByteString)]
forall a. a -> Maybe a
Just [(ByteString, Maybe ByteString)]
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
$ CreateFirewallOps -> ByteString
forall a. ToJSON a => a -> ByteString
encode CreateFirewallOps
createFirewallOps
      , 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
"/global/firewalls"
      }
  where
    queryToListFunc :: CreateFirewallQuery -> [(String, String)]
    queryToListFunc :: CreateFirewallQuery -> [(String, String)]
queryToListFunc CreateFirewallQuery
q =
      [Maybe (String, String)] -> [(String, String)]
forall a. [Maybe a] -> [a]
catMaybes
        [(String
"requestId",) (String -> (String, String))
-> Maybe String -> Maybe (String, String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CreateFirewallQuery -> Maybe String
requestId CreateFirewallQuery
q]

-- | Default firewall creation options
--
-- Creates minimal valid configuration with required name.
-- Additional fields can be added using record update syntax:
--
-- > defaultCreateFirewallOps "web-allow" 
-- >   { description = Just "Allow web traffic"
-- >   , allowed = Just [AllowedFirewall "tcp" (Just ["80","443"])]
-- >   }
defaultCreateFirewallOps :: String -> CreateFirewallOps
defaultCreateFirewallOps :: String -> CreateFirewallOps
defaultCreateFirewallOps String
firewallName =
  CreateFirewallOps
    { $sel:name:CreateFirewallOps :: String
name = String
firewallName
    , $sel:description:CreateFirewallOps :: Maybe String
description = Maybe String
forall a. Maybe a
Nothing
    , $sel:network:CreateFirewallOps :: Maybe String
network = Maybe String
forall a. Maybe a
Nothing
    , $sel:priority:CreateFirewallOps :: Maybe Int
priority = Maybe Int
forall a. Maybe a
Nothing
    , $sel:sourceRanges:CreateFirewallOps :: Maybe [String]
sourceRanges = Maybe [String]
forall a. Maybe a
Nothing
    , $sel:sourceTags:CreateFirewallOps :: Maybe [String]
sourceTags = Maybe [String]
forall a. Maybe a
Nothing
    , $sel:targetTags:CreateFirewallOps :: Maybe [String]
targetTags = Maybe [String]
forall a. Maybe a
Nothing
    , $sel:allowed:CreateFirewallOps :: Maybe [AllowedFirewall]
allowed = Maybe [AllowedFirewall]
forall a. Maybe a
Nothing
    , $sel:denied:CreateFirewallOps :: Maybe [DeniedFirewall]
denied = Maybe [DeniedFirewall]
forall a. Maybe a
Nothing
    , $sel:direction:CreateFirewallOps :: Maybe String
direction = Maybe String
forall a. Maybe a
Nothing
    , $sel:logConfig:CreateFirewallOps :: Maybe LogConfig
logConfig = Maybe LogConfig
forall a. Maybe a
Nothing
    , $sel:disabled:CreateFirewallOps :: Maybe Bool
disabled = Maybe Bool
forall a. Maybe a
Nothing
    }