This is the CloudLayer API for easy access to our REST based API services using F#.
To read about how to get started using CloudLayer, see documentation here.
You can reference it directly from Nuget or Paket.
PS> Install-Package CloudLayer.FSharpThe assembly targets NetStandard 2.0.
To begin, create an API key from the dashboard.
All API calls take in a Connection:
let connection = 
	{ Connection.Defaults with ApiKey = "ca-644907a519df4f84b0db24b822b37c5e" }If you are using this from an Asp.Net Core app, you can specify a IHttpClientFactory to be used (this is usually available through Dependency Injection),
let connection' = { connection with ClientFactory = factory }IHttpClientFactory avoids socket exhaustion problems and maintains a pool of HttpClient instances for reuse. See this article for more.
API calls have, as the last argument a Connection, and they take the shape:
connection |> CloudLayerApi.apiCall : Async<Result<ReturnValue, FailureReason>>All API calls return the Result type, and they follow the railway-oriented approach.
You can check the status of your account with
let status =
    connection |> CloudLayerApi.accountStatus |> Async.RunSynchronouslyThe results can be pattern matched.
match status with
| Ok status ->
    $"{status.Remaining} of {status.Limit} remaining. " +
    $"Limit resets at {status.ResetsAt.LocalDateTime}"
| Error err ->
    match err with
    | FailureReason.InvalidApiKey -> "Check your api key"
    | FailureReason.InsufficientCredit -> "Buy more credit pls"
    | FailureReason.SubscriptionInactive -> "Please activate your account"
    | FailureReason.Unauthorized -> "Please check your credentials or proxy"
    | other -> $"There was an error: {other}"
|> printfn "%s"CloudLayer can create images of public URLs:
let image = 
    connection |> CloudLayerApi.fetchImage (Url "https://google.com")and raw html:
let image = 
    connection |> CloudLayerApi.fetchImage (Html "<h1>Hello World!</h1>")and returns either a System.IO.Stream or a FailureReason.
match image with
| Ok (stream, status) ->
    //do something with stream
| Error err -> 
    failwithf "Something went wrong: %A" errYou can save the result to a file with saveToFile, or read directly to memory with toByteArray.
connection 
|> CloudLayerApi.fetchImage (Url "https://google.com") 
|> CloudLayerApi.saveToFile "google.jpg"
|> Async.RunSynchronouslyTo use more configuration options, use fetchImageWith. Options are specified by the ImageOptions record.
connection 
|> CloudLayerApi.fetchImageWith 
    { ImageOptions.Defaults with 
        Source = Url "https://www.openstreetmap.org#map=13/-6.1918/71.2976" 
        Timeout = TimeSpan.FromSeconds 60. 
        Inline = false }
|> CloudLayerApi.saveToFile "eagle-island.jpg"
|> Async.RunSynchronouslyCreating PDFs is similar to the API for creating images.
connection |> CloudLayerApi.fetchPdf (Url "https://en.wikipedia.org/wiki/Marine_snow")
connection |> CloudLayerApi.fetchPdf (Html "<h1>Hello from PDF!</h1>")For more options, use fetchPdfWith. Options are specified by the PdfOptions record.
connection 
|> CloudLayerApi.fetchPdfWith 
    { PdfOptions.Defaults with
        Source = (Url "https://en.wikipedia.org/wiki/Marine_snow") 
        PrintBackground = false
        Format = "A4" }
|> CloudLayerApi.saveToFile "snow.pdf"
|> Async.RunSynchronously
This library is specifically for F#, if you are using C# you should use our C# library. We did this because we wanted to give F# developers first class support instead of wrapping a C# library.
