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