package awskit-s3

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file range.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
type view = Bytes of int64 * int64 | From of int64 | Suffix of int64
type t = view

let invalid ?field message = Error (Awskit.Error.validation ?field message)

let result_exn = function
  | Ok value -> value
  | Error error -> invalid_arg (Awskit.Error.to_string_hum error)

let non_negative ~field value =
  if Int64.compare value 0L < 0 then
    invalid ~field (field ^ " must be non-negative")
  else Ok ()

let bytes ~start ~finish =
  match non_negative ~field:"range start" start with
  | Error _ as error -> error
  | Ok () -> (
      match non_negative ~field:"range finish" finish with
      | Error _ as error -> error
      | Ok () ->
          if Int64.compare finish start < 0 then
            invalid ~field:"range"
              "finish must be greater than or equal to start"
          else Ok (Bytes (start, finish)))

let bytes_exn ~start ~finish = result_exn (bytes ~start ~finish)

let from start =
  match non_negative ~field:"range start" start with
  | Error _ as error -> error
  | Ok () -> Ok (From start)

let from_exn start = result_exn (from start)

let suffix length =
  if Int64.compare length 0L <= 0 then
    invalid ~field:"range suffix" "suffix length must be positive"
  else Ok (Suffix length)

let suffix_exn length = result_exn (suffix length)

let to_header = function
  | Bytes (start, finish) -> Fmt.str "bytes=%Ld-%Ld" start finish
  | From start -> Fmt.str "bytes=%Ld-" start
  | Suffix length -> Fmt.str "bytes=-%Ld" length

let view = function
  | Bytes (start, finish) -> Bytes (start, finish)
  | From start -> From start
  | Suffix length -> Suffix length