You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by do...@apache.org on 2023/12/06 11:28:15 UTC
(incubator-opendal) branch main updated: feat: add operator.list support for OCaml binding (#3706)
This is an automated email from the ASF dual-hosted git repository.
dongyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git
The following commit(s) were added to refs/heads/main by this push:
new 876b185bf feat: add operator.list support for OCaml binding (#3706)
876b185bf is described below
commit 876b185bf4e5366955d58b83758dde9b99afd1f8
Author: Flash <do...@apache.org>
AuthorDate: Wed Dec 6 19:28:11 2023 +0800
feat: add operator.list support for OCaml binding (#3706)
feat: add operator.list support for OCaml binding
---
bindings/ocaml/lib/operator.ml | 7 ++++++
bindings/ocaml/lib/operator.mli | 11 +++++++++
bindings/ocaml/src/operator.ml | 8 +++++++
bindings/ocaml/src/operator.mli | 8 +++++++
bindings/ocaml/src/operator/_type.rs | 4 ++++
bindings/ocaml/src/operator/{_type.rs => entry.rs} | 26 +++++++++++++---------
bindings/ocaml/src/operator/mod.rs | 15 +++++++++++++
bindings/ocaml/test/test.ml | 18 +++++++++++++++
8 files changed, 86 insertions(+), 11 deletions(-)
diff --git a/bindings/ocaml/lib/operator.ml b/bindings/ocaml/lib/operator.ml
index a22a09d24..94841a8b3 100644
--- a/bindings/ocaml/lib/operator.ml
+++ b/bindings/ocaml/lib/operator.ml
@@ -18,6 +18,7 @@
*)
let new_operator = Opendal_core.Operator.operator
+let list = Opendal_core.Operator.blocking_list
let stat = Opendal_core.Operator.blocking_stat
let is_exist = Opendal_core.Operator.blocking_is_exist
let create_dir = Opendal_core.Operator.blocking_create_dir
@@ -53,3 +54,9 @@ module Metadata = struct
let etag = Opendal_core.Operator.metadata_etag
let last_modified = Opendal_core.Operator.metadata_last_modified
end
+
+module Entry = struct
+ let path = Opendal_core.Operator.entry_path
+ let name = Opendal_core.Operator.entry_name
+ let metadata = Opendal_core.Operator.entry_metadata
+end
diff --git a/bindings/ocaml/lib/operator.mli b/bindings/ocaml/lib/operator.mli
index e2493b89c..2403dadd5 100644
--- a/bindings/ocaml/lib/operator.mli
+++ b/bindings/ocaml/lib/operator.mli
@@ -28,6 +28,11 @@ val new_operator :
@return The block operator
*)
+val list :
+ Opendal_core.Operator.operator ->
+ string ->
+ (Opendal_core.Operator.entry array, string) result
+
val stat :
Opendal_core.Operator.operator ->
string ->
@@ -177,3 +182,9 @@ module Metadata : sig
val last_modified : Opendal_core.Operator.metadata -> int64 option
(** [last_modified metadata] Last modified of this entry.*)
end
+
+module Entry : sig
+ val path : Opendal_core.Operator.entry -> string
+ val name : Opendal_core.Operator.entry -> string
+ val metadata : Opendal_core.Operator.entry -> Opendal_core.Operator.metadata
+end
diff --git a/bindings/ocaml/src/operator.ml b/bindings/ocaml/src/operator.ml
index d911209b0..4c6e012dc 100644
--- a/bindings/ocaml/src/operator.ml
+++ b/bindings/ocaml/src/operator.ml
@@ -7,6 +7,13 @@ open! Bigarray
type operator
type reader
type metadata
+type entry
+
+(* file: entry.rs *)
+
+external entry_path: entry -> string = "entry_path"
+external entry_name: entry -> string = "entry_name"
+external entry_metadata: entry -> metadata = "entry_metadata"
(* file: metadata.rs *)
@@ -22,6 +29,7 @@ external metadata_last_modified: metadata -> int64 option = "metadata_last_modi
(* file: mod.rs *)
external operator: string -> (string * string) list -> (operator, string) Result.t = "operator"
+external blocking_list: operator -> string -> (entry array, string) Result.t = "blocking_list"
external blocking_stat: operator -> string -> (metadata, string) Result.t = "blocking_stat"
external blocking_is_exist: operator -> string -> (bool, string) Result.t = "blocking_is_exist"
external blocking_create_dir: operator -> string -> (bool, string) Result.t = "blocking_create_dir"
diff --git a/bindings/ocaml/src/operator.mli b/bindings/ocaml/src/operator.mli
index d911209b0..4c6e012dc 100644
--- a/bindings/ocaml/src/operator.mli
+++ b/bindings/ocaml/src/operator.mli
@@ -7,6 +7,13 @@ open! Bigarray
type operator
type reader
type metadata
+type entry
+
+(* file: entry.rs *)
+
+external entry_path: entry -> string = "entry_path"
+external entry_name: entry -> string = "entry_name"
+external entry_metadata: entry -> metadata = "entry_metadata"
(* file: metadata.rs *)
@@ -22,6 +29,7 @@ external metadata_last_modified: metadata -> int64 option = "metadata_last_modi
(* file: mod.rs *)
external operator: string -> (string * string) list -> (operator, string) Result.t = "operator"
+external blocking_list: operator -> string -> (entry array, string) Result.t = "blocking_list"
external blocking_stat: operator -> string -> (metadata, string) Result.t = "blocking_stat"
external blocking_is_exist: operator -> string -> (bool, string) Result.t = "blocking_is_exist"
external blocking_create_dir: operator -> string -> (bool, string) Result.t = "blocking_create_dir"
diff --git a/bindings/ocaml/src/operator/_type.rs b/bindings/ocaml/src/operator/_type.rs
index 0dda2e119..e79a3dde4 100644
--- a/bindings/ocaml/src/operator/_type.rs
+++ b/bindings/ocaml/src/operator/_type.rs
@@ -30,3 +30,7 @@ ocaml::custom!(Reader);
#[ocaml::sig]
pub struct Metadata(pub(crate) od::Metadata);
ocaml::custom!(Metadata);
+
+#[ocaml::sig]
+pub struct Entry(pub(crate) od::Entry);
+ocaml::custom!(Entry);
diff --git a/bindings/ocaml/src/operator/_type.rs b/bindings/ocaml/src/operator/entry.rs
similarity index 63%
copy from bindings/ocaml/src/operator/_type.rs
copy to bindings/ocaml/src/operator/entry.rs
index 0dda2e119..cf5b70a92 100644
--- a/bindings/ocaml/src/operator/_type.rs
+++ b/bindings/ocaml/src/operator/entry.rs
@@ -15,18 +15,22 @@
// specific language governing permissions and limitations
// under the License.
-// For ocaml-rs, the build order in the same build group is the order of the file names.
-// In order to use the type in the function in the generated ocaml file, it must be defined on the first generated file.
use super::*;
-#[ocaml::sig]
-pub struct Operator(pub(crate) od::BlockingOperator);
-ocaml::custom!(Operator);
+#[ocaml::func]
+#[ocaml::sig("entry -> string ")]
+pub fn entry_path(entry: &mut Entry) -> String {
+ entry.0.path().to_string()
+}
-#[ocaml::sig]
-pub struct Reader(pub(crate) od::BlockingReader);
-ocaml::custom!(Reader);
+#[ocaml::func]
+#[ocaml::sig("entry -> string ")]
+pub fn entry_name(entry: &mut Entry) -> String {
+ entry.0.name().to_string()
+}
-#[ocaml::sig]
-pub struct Metadata(pub(crate) od::Metadata);
-ocaml::custom!(Metadata);
+#[ocaml::func]
+#[ocaml::sig("entry -> metadata ")]
+pub fn entry_metadata(entry: &mut Entry) -> ocaml::Pointer<Metadata> {
+ Metadata(entry.0.metadata().clone()).into()
+}
diff --git a/bindings/ocaml/src/operator/mod.rs b/bindings/ocaml/src/operator/mod.rs
index f2a580fa7..4d9386f01 100644
--- a/bindings/ocaml/src/operator/mod.rs
+++ b/bindings/ocaml/src/operator/mod.rs
@@ -16,6 +16,7 @@
// under the License.
mod _type;
+mod entry;
mod metadata;
mod reader;
@@ -33,6 +34,20 @@ pub fn operator(
Ok(Operator(op.blocking()).into())
}
+#[ocaml::func]
+#[ocaml::sig("operator -> string -> (entry array, string) Result.t ")]
+pub fn blocking_list(
+ operator: &mut Operator,
+ path: String,
+) -> Result<Vec<ocaml::Pointer<Entry>>, String> {
+ map_res_error(
+ operator
+ .0
+ .list(path.as_str())
+ .map(|m| m.into_iter().map(|it| Entry(it).into()).collect()),
+ )
+}
+
#[ocaml::func]
#[ocaml::sig("operator -> string -> (metadata, string) Result.t ")]
pub fn blocking_stat(
diff --git a/bindings/ocaml/test/test.ml b/bindings/ocaml/test/test.ml
index a13e44b88..0dc96a254 100644
--- a/bindings/ocaml/test/test.ml
+++ b/bindings/ocaml/test/test.ml
@@ -82,6 +82,23 @@ let test_operator_stat test_ctxt =
assert_equal 10L (Operator.Metadata.content_length metadata);
()
+let test_list test_ctxt =
+ let bo = new_test_block_operator test_ctxt in
+ ignore (test_check_result (Operator.create_dir bo "/testdir/"));
+ ignore
+ (test_check_result
+ (Operator.write bo "/testdir/foo" (Bytes.of_string "bar")));
+ ignore
+ (test_check_result
+ (Operator.write bo "/testdir/bar" (Bytes.of_string "foo")));
+ let array = Operator.list bo "testdir/" |> test_check_result in
+ let names = Array.map Operator.Entry.name array in
+ let expected = [| "foo"; "bar" |] in
+ Array.sort compare expected;
+ assert_equal expected names;
+ assert_equal 2 (Array.length array);
+ ()
+
let suite =
"suite"
>::: [
@@ -91,6 +108,7 @@ let suite =
"test_copy_and_read" >:: test_copy_and_read;
"test_operator_reader" >:: test_operator_reader;
"test_operator_stat" >:: test_operator_stat;
+ "test_list" >:: test_list;
]
let () = run_test_tt_main suite