[Variant] Add ListBuilder::with_value for convenience (#7959)

# Which issue does this PR close?


- Closes #7951 .

# Rationale for this change


# What changes are included in this PR?


# Are these changes tested?

Yes
# Are there any user-facing changes?

New API

Signed-off-by: codephage2020 <tingwangyan2020@163.com>
diff --git a/parquet-variant-json/src/to_json.rs b/parquet-variant-json/src/to_json.rs
index 31cf044..a3ff04b 100644
--- a/parquet-variant-json/src/to_json.rs
+++ b/parquet-variant-json/src/to_json.rs
@@ -945,15 +945,14 @@
 
         let mut builder = VariantBuilder::new();
 
-        {
-            let mut list = builder.new_list();
-            list.append_value(1i32);
-            list.append_value(2i32);
-            list.append_value(3i32);
-            list.append_value(4i32);
-            list.append_value(5i32);
-            list.finish();
-        }
+        builder
+            .new_list()
+            .with_value(1i32)
+            .with_value(2i32)
+            .with_value(3i32)
+            .with_value(4i32)
+            .with_value(5i32)
+            .finish();
 
         let (metadata, value) = builder.finish();
         let variant = Variant::try_new(&metadata, &value)?;
@@ -997,15 +996,14 @@
 
         let mut builder = VariantBuilder::new();
 
-        {
-            let mut list = builder.new_list();
-            list.append_value("hello");
-            list.append_value(42i32);
-            list.append_value(true);
-            list.append_value(()); // null
-            list.append_value(std::f64::consts::PI);
-            list.finish();
-        }
+        builder
+            .new_list()
+            .with_value("hello")
+            .with_value(42i32)
+            .with_value(true)
+            .with_value(()) // null
+            .with_value(std::f64::consts::PI)
+            .finish();
 
         let (metadata, value) = builder.finish();
         let variant = Variant::try_new(&metadata, &value)?;
@@ -1059,17 +1057,16 @@
 
         let mut builder = VariantBuilder::new();
 
-        {
-            let mut list = builder.new_list();
-            list.append_value("string_value");
-            list.append_value(42i32);
-            list.append_value(true);
-            list.append_value(std::f64::consts::PI);
-            list.append_value(false);
-            list.append_value(()); // null
-            list.append_value(100i64);
-            list.finish();
-        }
+        builder
+            .new_list()
+            .with_value("string_value")
+            .with_value(42i32)
+            .with_value(true)
+            .with_value(std::f64::consts::PI)
+            .with_value(false)
+            .with_value(()) // null
+            .with_value(100i64)
+            .finish();
 
         let (metadata, value) = builder.finish();
         let variant = Variant::try_new(&metadata, &value)?;
diff --git a/parquet-variant/src/builder.rs b/parquet-variant/src/builder.rs
index 6ef91e1..d0eb487 100644
--- a/parquet-variant/src/builder.rs
+++ b/parquet-variant/src/builder.rs
@@ -681,6 +681,7 @@
 ///  list_builder.append_value(1i8);
 ///  list_builder.append_value(2i8);
 ///  list_builder.append_value(3i8);
+/// // call finish to finalize the list
 ///  list_builder.finish();
 /// // Finish the builder to get the metadata and value
 /// let (metadata, value) = builder.finish();
@@ -693,6 +694,24 @@
 /// assert_eq!(variant_list.get(2).unwrap(), Variant::Int8(3));
 /// ```
 ///
+/// You can also use the [`ListBuilder::with_value`] to append values to the
+/// list.
+/// ```
+///  # use parquet_variant::{Variant, VariantBuilder};
+///  let mut builder = VariantBuilder::new();
+///  builder.new_list()
+///      .with_value(1i8)
+///      .with_value(2i8)
+///      .with_value(3i8)
+///      .finish();
+/// let (metadata, value) = builder.finish();
+/// let variant = Variant::try_new(&metadata, &value).unwrap();
+/// let variant_list = variant.as_list().unwrap();
+/// assert_eq!(variant_list.get(0).unwrap(), Variant::Int8(1));
+/// assert_eq!(variant_list.get(1).unwrap(), Variant::Int8(2));
+/// assert_eq!(variant_list.get(2).unwrap(), Variant::Int8(3));
+/// ```
+///
 /// # Example: [`Variant::List`] of  [`Variant::Object`]s
 ///
 /// This example shows how to create an list of objects:
@@ -1062,6 +1081,28 @@
         Ok(())
     }
 
+    /// Builder-style API for appending a value to the list and returning self to enable method chaining.
+    ///
+    /// # Panics
+    ///
+    /// This method will panic if the variant contains duplicate field names in objects
+    /// when validation is enabled. For a fallible version, use [`ListBuilder::try_with_value`].
+    pub fn with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(mut self, value: T) -> Self {
+        self.append_value(value);
+        self
+    }
+
+    /// Builder-style API for appending a value to the list and returns self for method chaining.
+    ///
+    /// This is the fallible version of [`ListBuilder::with_value`].
+    pub fn try_with_value<'m, 'd, T: Into<Variant<'m, 'd>>>(
+        mut self,
+        value: T,
+    ) -> Result<Self, ArrowError> {
+        self.try_append_value(value)?;
+        Ok(self)
+    }
+
     /// Finalizes this list and appends it to its parent, which otherwise remains unmodified.
     pub fn finish(mut self) {
         let data_size = self.buffer.offset();
@@ -1430,13 +1471,12 @@
     fn test_list() {
         let mut builder = VariantBuilder::new();
 
-        {
-            let mut list = builder.new_list();
-            list.append_value(1i8);
-            list.append_value(2i8);
-            list.append_value("test");
-            list.finish();
-        }
+        builder
+            .new_list()
+            .with_value(1i8)
+            .with_value(2i8)
+            .with_value("test")
+            .finish();
 
         let (metadata, value) = builder.finish();
         assert!(!metadata.is_empty());
@@ -1531,16 +1571,14 @@
 
         let mut outer_list_builder = builder.new_list();
 
-        {
-            let mut inner_list_builder = outer_list_builder.new_list();
-
-            inner_list_builder.append_value("a");
-            inner_list_builder.append_value("b");
-            inner_list_builder.append_value("c");
-            inner_list_builder.append_value("d");
-
-            inner_list_builder.finish();
-        }
+        // create inner list
+        outer_list_builder
+            .new_list()
+            .with_value("a")
+            .with_value("b")
+            .with_value("c")
+            .with_value("d")
+            .finish();
 
         outer_list_builder.finish();
 
@@ -1873,12 +1911,12 @@
             {
                 let mut inner_object_builder = outer_object_builder.new_object("door 1");
 
-                {
-                    let mut inner_object_list_builder = inner_object_builder.new_list("items");
-                    inner_object_list_builder.append_value("apple");
-                    inner_object_list_builder.append_value(false);
-                    inner_object_list_builder.finish();
-                }
+                // create inner_object_list
+                inner_object_builder
+                    .new_list("items")
+                    .with_value("apple")
+                    .with_value(false)
+                    .finish();
 
                 let _ = inner_object_builder.finish();
             }
@@ -2310,10 +2348,11 @@
 
     /// append a simple List variant
     fn append_test_list(builder: &mut VariantBuilder) {
-        let mut list = builder.new_list();
-        list.append_value(1234);
-        list.append_value("a string value");
-        list.finish();
+        builder
+            .new_list()
+            .with_value(1234)
+            .with_value("a string value")
+            .finish();
     }
 
     /// append an object variant
@@ -2651,10 +2690,13 @@
     /// make a simple List variant
     fn make_list() -> (Vec<u8>, Vec<u8>) {
         let mut builder = VariantBuilder::new();
-        let mut list = builder.new_list();
-        list.append_value(1234);
-        list.append_value("a string value");
-        list.finish();
+
+        builder
+            .new_list()
+            .with_value(1234)
+            .with_value("a string value")
+            .finish();
+
         builder.finish()
     }
 
@@ -2672,12 +2714,11 @@
         let mut builder = VariantBuilder::new();
         let mut list = builder.new_list();
 
-        let mut inner_list = list.new_list();
-
-        inner_list.append_value("the dog licked the oil");
-        inner_list.append_value(4.3);
-
-        inner_list.finish();
+        //create inner list
+        list.new_list()
+            .with_value("the dog licked the oil")
+            .with_value(4.3)
+            .finish();
 
         list.finish();