Skip to content

Commit 4cb5551

Browse files
committed
Get object
1 parent dba6146 commit 4cb5551

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

src/bucket/get_object.gleam

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//// <https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html>
2+
3+
import bucket.{type BucketError, type Credentials}
4+
import bucket/internal
5+
import gleam/http
6+
import gleam/http/request.{type Request, Request}
7+
import gleam/http/response.{type Response}
8+
9+
pub type RequestBuilder {
10+
RequestBuilder(bucket: String, key: String)
11+
}
12+
13+
pub type Outcome(body) {
14+
Found(body)
15+
NotFound
16+
}
17+
18+
pub fn request(bucket bucket: String, key key: String) -> RequestBuilder {
19+
RequestBuilder(bucket:, key:)
20+
}
21+
22+
pub fn build(builder: RequestBuilder, creds: Credentials) -> Request(BitArray) {
23+
let headers = []
24+
internal.request(
25+
creds,
26+
http.Get,
27+
"/" <> builder.bucket <> "/" <> builder.key,
28+
[],
29+
headers,
30+
<<>>,
31+
)
32+
}
33+
34+
pub fn response(response: Response(body)) -> Result(Outcome(body), BucketError) {
35+
case response.status {
36+
200 -> Ok(Found(response.body))
37+
404 -> Ok(NotFound)
38+
_ ->
39+
Error(bucket.UnexpectedResponseError(response.set_body(response, <<>>)))
40+
}
41+
}

test/bucket_test.gleam

+34
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import bucket.{ErrorObject, S3Error}
22
import bucket/create_bucket
33
import bucket/delete_bucket
44
import bucket/delete_objects
5+
import bucket/get_object
56
import bucket/head_bucket
67
import bucket/head_object
78
import bucket/list_buckets.{ListAllMyBucketsResult}
@@ -336,3 +337,36 @@ pub fn head_object_if_match_not_matching_test() {
336337
|> httpc.send_bits
337338
let assert Ok(head_object.PreconditionFailed) = head_object.response(res)
338339
}
340+
341+
pub fn get_object_bucket_not_found_test() {
342+
helpers.delete_existing_buckets()
343+
344+
let assert Ok(res) =
345+
get_object.request("bucket", "key")
346+
|> get_object.build(helpers.creds)
347+
|> httpc.send_bits
348+
let assert Ok(get_object.NotFound) = get_object.response(res)
349+
}
350+
351+
pub fn get_object_object_not_found_test() {
352+
helpers.delete_existing_buckets()
353+
helpers.create_bucket("bucket")
354+
355+
let assert Ok(res) =
356+
get_object.request("bucket", "key")
357+
|> get_object.build(helpers.creds)
358+
|> httpc.send_bits
359+
let assert Ok(get_object.NotFound) = get_object.response(res)
360+
}
361+
362+
pub fn get_object_found_test() {
363+
helpers.delete_existing_buckets()
364+
helpers.create_bucket("bucket")
365+
helpers.create_object("bucket", "key", <<"yes":utf8>>)
366+
367+
let assert Ok(res) =
368+
get_object.request("bucket", "key")
369+
|> get_object.build(helpers.creds)
370+
|> httpc.send_bits
371+
let assert Ok(get_object.Found(<<"yes":utf8>>)) = get_object.response(res)
372+
}

0 commit comments

Comments
 (0)