Expose primitive internals just enough for enums

PiperOrigin-RevId: 591933966
diff --git a/rust/internal.rs b/rust/internal.rs
index 2b7676b..6a6ca30 100644
--- a/rust/internal.rs
+++ b/rust/internal.rs
@@ -11,7 +11,7 @@
 
 pub use crate::vtable::{
     new_vtable_field_entry, BytesMutVTable, BytesOptionalMutVTable, PrimitiveOptionalMutVTable,
-    PrimitiveVTable, PrimitiveWithRawVTable, RawVTableMutator,
+    PrimitiveVTable, PrimitiveWithRawVTable, RawVTableMutator, RawVTableOptionalMutatorData,
 };
 use std::ptr::NonNull;
 use std::slice;
diff --git a/rust/primitive.rs b/rust/primitive.rs
index 193901b..7c34795 100644
--- a/rust/primitive.rs
+++ b/rust/primitive.rs
@@ -45,12 +45,20 @@
 where
     T: PrimitiveWithRawVTable,
 {
+    /// Gets the current value of the field.
     pub fn get(&self) -> View<'_, T> {
         T::make_view(Private, self.inner)
     }
 
+    /// Sets a new value for the field.
     pub fn set(&mut self, val: impl SettableValue<T>) {
-        MutProxy::set(self, val)
+        val.set_on(Private, self.as_mut())
+    }
+
+    #[doc(hidden)]
+    pub fn set_primitive(&mut self, _private: Private, value: T) {
+        // SAFETY: the raw mutator is valid for `'msg` as enforced by `Mut`
+        unsafe { self.inner.set(value) }
     }
 }
 
@@ -106,9 +114,17 @@
         }
 
         impl SettableValue<$t> for $t {
-            fn set_on<'msg>(self, _private: Private, mutator: Mut<'msg, $t>) where $t: 'msg {
-              // SAFETY: the raw mutator is valid for `'msg` as enforced by `Mut`
-              unsafe { mutator.inner.set(self) }
+            fn set_on<'msg>(self, private: Private, mut mutator: Mut<'msg, $t>) where $t: 'msg {
+                mutator.set_primitive(private, self)
+            }
+
+            fn set_on_absent(
+                self,
+                _private: Private,
+                absent_mutator: <$t as ProxiedWithPresence>::PresentMutData<'_>,
+            ) -> <$t as ProxiedWithPresence>::AbsentMutData<'_>
+            {
+                absent_mutator.set(Private, self)
             }
         }
 
@@ -119,13 +135,13 @@
             fn clear_present_field(
                 present_mutator: Self::PresentMutData<'_>,
             ) -> Self::AbsentMutData<'_> {
-                present_mutator.clear()
+                present_mutator.clear(Private)
             }
 
             fn set_absent_to_default(
                 absent_mutator: Self::AbsentMutData<'_>,
             ) -> Self::PresentMutData<'_> {
-                absent_mutator.set_absent_to_default()
+                absent_mutator.set_absent_to_default(Private)
             }
         }
 
diff --git a/rust/vtable.rs b/rust/vtable.rs
index 3118096..5adca11 100644
--- a/rust/vtable.rs
+++ b/rust/vtable.rs
@@ -482,14 +482,14 @@
 }
 
 impl<'msg, T: PrimitiveWithRawVTable> RawVTableOptionalMutatorData<'msg, T> {
-    pub(crate) fn set_absent_to_default(self) -> Self {
+    pub fn set_absent_to_default(self, private: Private) -> Self {
         // SAFETY:
         // - `msg_ref` is valid for the lifetime of `RawVTableOptionalMutatorData` as
         //   promised by the caller of `new`.
-        self.set(self.optional_vtable().default)
+        self.set(private, self.optional_vtable().default)
     }
 
-    pub(crate) fn set(self, val: T) -> Self {
+    pub fn set(self, _private: Private, val: T) -> Self {
         // SAFETY:
         // - `msg_ref` is valid for the lifetime of `RawVTableOptionalMutatorData` as
         //   promised by the caller of `new`.
@@ -497,7 +497,7 @@
         self
     }
 
-    pub(crate) fn clear(self) -> Self {
+    pub fn clear(self, _private: Private) -> Self {
         // SAFETY:
         // - `msg_ref` is valid for the lifetime of `RawVTableOptionalMutatorData` as
         //   promised by the caller of `new`.