-- | @\/v1\/images\/edits@
module OpenAI.V1.Images.Edits
    ( -- * Main types
      CreateImageEdit(..)
    , _CreateImageEdit
      -- * Other types
    , ResponseFormat(..)
      -- * Servant
    , API
    ) where

import OpenAI.Prelude
import OpenAI.V1.Images.Image
import OpenAI.V1.Images.ResponseFormat
import OpenAI.V1.ListOf
import OpenAI.V1.Models (Model(..))

import qualified Data.Text as Text

-- | Request body for @\/v1\/images\/edits@
data CreateImageEdit = CreateImageEdit
    { CreateImageEdit -> FilePath
image :: FilePath
    , CreateImageEdit -> Text
prompt :: Text
    , CreateImageEdit -> Maybe FilePath
mask :: Maybe FilePath
    , CreateImageEdit -> Maybe Model
model :: Maybe Model
    , CreateImageEdit -> Maybe Natural
n :: Maybe Natural
    , CreateImageEdit -> Maybe Text
size :: Maybe Text
    , CreateImageEdit -> Maybe ResponseFormat
response_format :: Maybe ResponseFormat
    , CreateImageEdit -> Maybe Text
user :: Maybe Text
    } deriving stock ((forall x. CreateImageEdit -> Rep CreateImageEdit x)
-> (forall x. Rep CreateImageEdit x -> CreateImageEdit)
-> Generic CreateImageEdit
forall x. Rep CreateImageEdit x -> CreateImageEdit
forall x. CreateImageEdit -> Rep CreateImageEdit x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. CreateImageEdit -> Rep CreateImageEdit x
from :: forall x. CreateImageEdit -> Rep CreateImageEdit x
$cto :: forall x. Rep CreateImageEdit x -> CreateImageEdit
to :: forall x. Rep CreateImageEdit x -> CreateImageEdit
Generic, Int -> CreateImageEdit -> ShowS
[CreateImageEdit] -> ShowS
CreateImageEdit -> FilePath
(Int -> CreateImageEdit -> ShowS)
-> (CreateImageEdit -> FilePath)
-> ([CreateImageEdit] -> ShowS)
-> Show CreateImageEdit
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CreateImageEdit -> ShowS
showsPrec :: Int -> CreateImageEdit -> ShowS
$cshow :: CreateImageEdit -> FilePath
show :: CreateImageEdit -> FilePath
$cshowList :: [CreateImageEdit] -> ShowS
showList :: [CreateImageEdit] -> ShowS
Show)

-- | Default `CreateImageEdit`
_CreateImageEdit :: CreateImageEdit
_CreateImageEdit :: CreateImageEdit
_CreateImageEdit = CreateImageEdit
    { $sel:mask:CreateImageEdit :: Maybe FilePath
mask = Maybe FilePath
forall a. Maybe a
Nothing
    , $sel:model:CreateImageEdit :: Maybe Model
model = Maybe Model
forall a. Maybe a
Nothing
    , $sel:n:CreateImageEdit :: Maybe Natural
n = Maybe Natural
forall a. Maybe a
Nothing
    , $sel:size:CreateImageEdit :: Maybe Text
size = Maybe Text
forall a. Maybe a
Nothing
    , $sel:response_format:CreateImageEdit :: Maybe ResponseFormat
response_format = Maybe ResponseFormat
forall a. Maybe a
Nothing
    , $sel:user:CreateImageEdit :: Maybe Text
user = Maybe Text
forall a. Maybe a
Nothing
    }

instance ToMultipart Tmp CreateImageEdit where
    toMultipart :: CreateImageEdit -> MultipartData Tmp
toMultipart CreateImageEdit{ FilePath
Maybe Natural
Maybe FilePath
Maybe Text
Maybe ResponseFormat
Maybe Model
Text
$sel:image:CreateImageEdit :: CreateImageEdit -> FilePath
$sel:prompt:CreateImageEdit :: CreateImageEdit -> Text
$sel:mask:CreateImageEdit :: CreateImageEdit -> Maybe FilePath
$sel:model:CreateImageEdit :: CreateImageEdit -> Maybe Model
$sel:n:CreateImageEdit :: CreateImageEdit -> Maybe Natural
$sel:size:CreateImageEdit :: CreateImageEdit -> Maybe Text
$sel:response_format:CreateImageEdit :: CreateImageEdit -> Maybe ResponseFormat
$sel:user:CreateImageEdit :: CreateImageEdit -> Maybe Text
image :: FilePath
prompt :: Text
mask :: Maybe FilePath
model :: Maybe Model
n :: Maybe Natural
size :: Maybe Text
response_format :: Maybe ResponseFormat
user :: Maybe Text
..} = MultipartData{[Input]
[FileData Tmp]
inputs :: [Input]
files :: [FileData Tmp]
inputs :: [Input]
files :: [FileData Tmp]
..}
      where
        inputs :: [Input]
inputs =
                Text -> Text -> [Input]
input Text
"prompt" Text
prompt
            [Input] -> [Input] -> [Input]
forall a. Semigroup a => a -> a -> a
<>  (Model -> [Input]) -> Maybe Model -> [Input]
forall m a. Monoid m => (a -> m) -> Maybe a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Text -> Text -> [Input]
input Text
"model" (Text -> [Input]) -> (Model -> Text) -> Model -> [Input]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Model -> Text
text) Maybe Model
model
            [Input] -> [Input] -> [Input]
forall a. Semigroup a => a -> a -> a
<>  (Natural -> [Input]) -> Maybe Natural -> [Input]
forall m a. Monoid m => (a -> m) -> Maybe a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Text -> Text -> [Input]
input Text
"n" (Text -> [Input]) -> (Natural -> Text) -> Natural -> [Input]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Natural -> Text
forall number. Integral number => number -> Text
renderIntegral) Maybe Natural
n
            [Input] -> [Input] -> [Input]
forall a. Semigroup a => a -> a -> a
<>  (Text -> [Input]) -> Maybe Text -> [Input]
forall m a. Monoid m => (a -> m) -> Maybe a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Text -> Text -> [Input]
input Text
"size") Maybe Text
size
            [Input] -> [Input] -> [Input]
forall a. Semigroup a => a -> a -> a
<>  (ResponseFormat -> [Input]) -> Maybe ResponseFormat -> [Input]
forall m a. Monoid m => (a -> m) -> Maybe a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Text -> Text -> [Input]
input Text
"response_format" (Text -> [Input])
-> (ResponseFormat -> Text) -> ResponseFormat -> [Input]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResponseFormat -> Text
forall a. ToHttpApiData a => a -> Text
toUrlPiece) Maybe ResponseFormat
response_format
            [Input] -> [Input] -> [Input]
forall a. Semigroup a => a -> a -> a
<>  (Text -> [Input]) -> Maybe Text -> [Input]
forall m a. Monoid m => (a -> m) -> Maybe a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Text -> Text -> [Input]
input Text
"user") Maybe Text
user

        files :: [FileData Tmp]
files = FileData Tmp
file0 FileData Tmp -> [FileData Tmp] -> [FileData Tmp]
forall a. a -> [a] -> [a]
: [FileData Tmp]
files1
          where
            file0 :: FileData Tmp
file0 = FileData{FilePath
Text
MultipartResult Tmp
fdInputName :: Text
fdFileName :: Text
fdFileCType :: Text
fdPayload :: FilePath
fdInputName :: Text
fdFileName :: Text
fdFileCType :: Text
fdPayload :: MultipartResult Tmp
..}
              where
                fdInputName :: Text
fdInputName = Text
"image"
                fdFileName :: Text
fdFileName = FilePath -> Text
Text.pack FilePath
image
                fdFileCType :: Text
fdFileCType = Text
"image/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> FilePath -> Text
getExtension FilePath
image
                fdPayload :: FilePath
fdPayload = FilePath
image

            files1 :: [FileData Tmp]
files1 = case Maybe FilePath
mask of
                Maybe FilePath
Nothing -> [ ]
                Just FilePath
m -> [ FileData{FilePath
Text
MultipartResult Tmp
fdInputName :: Text
fdFileName :: Text
fdFileCType :: Text
fdPayload :: MultipartResult Tmp
fdInputName :: Text
fdFileName :: Text
fdFileCType :: Text
fdPayload :: FilePath
..} ]
                  where
                    fdInputName :: Text
fdInputName = Text
"mask"
                    fdFileName :: Text
fdFileName = FilePath -> Text
Text.pack FilePath
m
                    fdFileCType :: Text
fdFileCType = Text
"image/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> FilePath -> Text
getExtension FilePath
m
                    fdPayload :: FilePath
fdPayload = FilePath
m

-- | Servant API
type API =
        "edits"
    :>  MultipartForm Tmp CreateImageEdit
    :>  Post '[JSON] (ListOf ImageObject)