module Cloudy.LocalConfFile where
import Cloudy.Path (getCloudyConfFilePath)
import Control.Exception (throwIO)
import Data.Aeson (FromJSON (parseJSON), withObject, (.:?), Value (Null), Object)
import Data.Aeson.Types (Parser)
import qualified Data.ByteString as BS
import Data.Text (Text)
import Data.Yaml (decodeEither')
import System.IO.Error (tryIOError, isDoesNotExistError)
data LocalConfFileScalewayOpts = LocalConfFileScalewayOpts
{ LocalConfFileScalewayOpts -> Maybe Text
accessKey :: Maybe Text
, LocalConfFileScalewayOpts -> Maybe Text
secretKey :: Maybe Text
, LocalConfFileScalewayOpts -> Maybe Text
defaultOrganizationId :: Maybe Text
, LocalConfFileScalewayOpts -> Maybe Text
defaultProjectId :: Maybe Text
, LocalConfFileScalewayOpts -> Maybe Text
defaultZone :: Maybe Text
, LocalConfFileScalewayOpts -> Maybe Text
defaultInstanceType :: Maybe Text
, LocalConfFileScalewayOpts -> Maybe Text
defaultImageId :: Maybe Text
} deriving Int -> LocalConfFileScalewayOpts -> ShowS
[LocalConfFileScalewayOpts] -> ShowS
LocalConfFileScalewayOpts -> String
(Int -> LocalConfFileScalewayOpts -> ShowS)
-> (LocalConfFileScalewayOpts -> String)
-> ([LocalConfFileScalewayOpts] -> ShowS)
-> Show LocalConfFileScalewayOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LocalConfFileScalewayOpts -> ShowS
showsPrec :: Int -> LocalConfFileScalewayOpts -> ShowS
$cshow :: LocalConfFileScalewayOpts -> String
show :: LocalConfFileScalewayOpts -> String
$cshowList :: [LocalConfFileScalewayOpts] -> ShowS
showList :: [LocalConfFileScalewayOpts] -> ShowS
Show
instance FromJSON LocalConfFileScalewayOpts where
parseJSON :: Value -> Parser LocalConfFileScalewayOpts
parseJSON :: Value -> Parser LocalConfFileScalewayOpts
parseJSON = String
-> (Object -> Parser LocalConfFileScalewayOpts)
-> Value
-> Parser LocalConfFileScalewayOpts
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"LocalConfFileScalewayOpts" ((Object -> Parser LocalConfFileScalewayOpts)
-> Value -> Parser LocalConfFileScalewayOpts)
-> (Object -> Parser LocalConfFileScalewayOpts)
-> Value
-> Parser LocalConfFileScalewayOpts
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
Maybe Text
accessKey <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"access_key"
Maybe Text
secretKey <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"secret_key"
Maybe Text
defaultOrganizationId <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"default_organization_id"
Maybe Text
defaultProjectId <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"default_project_id"
Maybe Text
defaultZone <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"default_zone"
Maybe Text
defaultInstanceType <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"default_instance_type"
Maybe Text
defaultImageId <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"default_image_id"
LocalConfFileScalewayOpts -> Parser LocalConfFileScalewayOpts
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
LocalConfFileScalewayOpts
{ Maybe Text
$sel:accessKey:LocalConfFileScalewayOpts :: Maybe Text
accessKey :: Maybe Text
accessKey
, Maybe Text
$sel:secretKey:LocalConfFileScalewayOpts :: Maybe Text
secretKey :: Maybe Text
secretKey
, Maybe Text
$sel:defaultOrganizationId:LocalConfFileScalewayOpts :: Maybe Text
defaultOrganizationId :: Maybe Text
defaultOrganizationId
, Maybe Text
$sel:defaultProjectId:LocalConfFileScalewayOpts :: Maybe Text
defaultProjectId :: Maybe Text
defaultProjectId
, Maybe Text
$sel:defaultZone:LocalConfFileScalewayOpts :: Maybe Text
defaultZone :: Maybe Text
defaultZone
, Maybe Text
$sel:defaultInstanceType:LocalConfFileScalewayOpts :: Maybe Text
defaultInstanceType :: Maybe Text
defaultInstanceType
, Maybe Text
$sel:defaultImageId:LocalConfFileScalewayOpts :: Maybe Text
defaultImageId :: Maybe Text
defaultImageId
}
data LocalConfFileOpts = LocalConfFileOpts
{ LocalConfFileOpts -> Maybe LocalConfFileScalewayOpts
scaleway :: Maybe LocalConfFileScalewayOpts
} deriving Int -> LocalConfFileOpts -> ShowS
[LocalConfFileOpts] -> ShowS
LocalConfFileOpts -> String
(Int -> LocalConfFileOpts -> ShowS)
-> (LocalConfFileOpts -> String)
-> ([LocalConfFileOpts] -> ShowS)
-> Show LocalConfFileOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LocalConfFileOpts -> ShowS
showsPrec :: Int -> LocalConfFileOpts -> ShowS
$cshow :: LocalConfFileOpts -> String
show :: LocalConfFileOpts -> String
$cshowList :: [LocalConfFileOpts] -> ShowS
showList :: [LocalConfFileOpts] -> ShowS
Show
instance FromJSON LocalConfFileOpts where
parseJSON :: Value -> Parser LocalConfFileOpts
parseJSON Value
Null = LocalConfFileOpts -> Parser LocalConfFileOpts
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LocalConfFileOpts
defaultLocalConfFileOpts
parseJSON Value
v = String
-> (Object -> Parser LocalConfFileOpts)
-> Value
-> Parser LocalConfFileOpts
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"LocalConfFileOpts" Object -> Parser LocalConfFileOpts
parseObj Value
v
where
parseObj :: Object -> Parser LocalConfFileOpts
parseObj :: Object -> Parser LocalConfFileOpts
parseObj Object
o = do
Maybe LocalConfFileScalewayOpts -> LocalConfFileOpts
LocalConfFileOpts (Maybe LocalConfFileScalewayOpts -> LocalConfFileOpts)
-> Parser (Maybe LocalConfFileScalewayOpts)
-> Parser LocalConfFileOpts
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser (Maybe LocalConfFileScalewayOpts)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"scaleway"
defaultLocalConfFileOpts :: LocalConfFileOpts
defaultLocalConfFileOpts :: LocalConfFileOpts
defaultLocalConfFileOpts = LocalConfFileOpts { $sel:scaleway:LocalConfFileOpts :: Maybe LocalConfFileScalewayOpts
scaleway = Maybe LocalConfFileScalewayOpts
forall a. Maybe a
Nothing }
readLocalConfFile :: IO LocalConfFileOpts
readLocalConfFile :: IO LocalConfFileOpts
readLocalConfFile = do
String
confFilePath <- IO String
getCloudyConfFilePath
Either IOError ByteString
eitherConfFileRaw <- IO ByteString -> IO (Either IOError ByteString)
forall a. IO a -> IO (Either IOError a)
tryIOError (String -> IO ByteString
BS.readFile String
confFilePath)
case Either IOError ByteString
eitherConfFileRaw of
Left IOError
ioEx
| IOError -> Bool
isDoesNotExistError IOError
ioEx ->
LocalConfFileOpts -> IO LocalConfFileOpts
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LocalConfFileOpts
defaultLocalConfFileOpts
| Bool
otherwise ->
IOError -> IO LocalConfFileOpts
forall e a. Exception e => e -> IO a
throwIO IOError
ioEx
Right ByteString
confFileRaw -> do
let eitherConfFileOpts :: Either ParseException LocalConfFileOpts
eitherConfFileOpts = ByteString -> Either ParseException LocalConfFileOpts
forall a. FromJSON a => ByteString -> Either ParseException a
decodeEither' ByteString
confFileRaw
case Either ParseException LocalConfFileOpts
eitherConfFileOpts of
Left ParseException
parseErr ->
ParseException -> IO LocalConfFileOpts
forall e a. Exception e => e -> IO a
throwIO ParseException
parseErr
Right LocalConfFileOpts
confFile -> LocalConfFileOpts -> IO LocalConfFileOpts
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure LocalConfFileOpts
confFile