# google-cloud-storage
Haskell idiomatic client for [Google Cloud Platform](https://cloud.google.com/) Storage service.
Full docs are available at https://github.com/tusharad/google-cloud-haskell
## Installation
- Cabal: add to your `.cabal`
- `build-depends: google-cloud-storage == 1.1.0.0`
- Stack: add to your `package.yaml`
- `dependencies: - google-cloud-storage == 1.1.0.0`
This package depends on `google-cloud-common` for authentication and HTTP helpers.
## Authentication
Authentication is handled by `google-cloud-common` and follows this order:
1. Use `GOOGLE_APPLICATION_CREDENTIALS` to load a Service Account JSON and
exchange a signed JWT for an access token.
2. Otherwise, use the Compute metadata server (suitable for GCE/GKE).
## Examples
Minimal examples using `Google.Cloud.Storage.Bucket`:
```haskell
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.ByteString.Lazy.Char8 as BSL
import Google.Cloud.Storage.Bucket
-- List buckets in a project
listBucketsExample :: IO ()
listBucketsExample = do
let projectId = "my-gcp-project"
eRes <- listBuckets projectId
case eRes of
Left err -> putStrLn ("Error: " <> err)
Right buckets -> print buckets
-- Create a bucket
createBucketExample :: IO ()
createBucketExample = do
let newBucket = CreateBucketData
{ name = "my-unique-bucket-name"
, location = Location "us-central1"
, storageClass = STANDARD
, projectId = "my-gcp-project"
}
eRes <- createBucket newBucket
case eRes of
Left err -> putStrLn ("Create error: " <> err)
Right _ -> putStrLn "Bucket created"
-- Upload and download objects
objectOpsExample :: IO ()
objectOpsExample = do
let bucket = "my-bucket"
object = "my-object.txt"
_ <- uploadObject bucket object (BSL.pack "Hello, world!")
eBody <- downloadObject bucket object
case eBody of
Left err -> putStrLn ("Download error: " <> err)
Right body -> BSL.putStrLn body
-- Copy and delete an object
copyDeleteExample :: IO ()
copyDeleteExample = do
let req = CopyObjectRequest
{ sourceBucketName = "my-bucket"
, sourceObjectName = "my-object.txt"
, destinationBucketName = "another-bucket"
, destinationObject = "copied-object.txt"
}
_ <- copyObject req
_ <- deleteObject "my-bucket" "my-object.txt"
pure ()
```
## License
MIT © Contributors