Make `impl rustc_driver::Callbacks` a private detail of `bindings_driver`.

Before this CL, `bindings_driver::RunCompiler` would publically implement
`rustc_driver::Callbacks` trait, making it theoretically possible to
use the callbacks twice (which would trigger the asserts related to
`bindings_main_result`).

After this CL, the trait `impl` is hidden as a private detail of the
`bindings_driver` module.

PiperOrigin-RevId: 476371937
diff --git a/cc_bindings_from_rs/main.rs b/cc_bindings_from_rs/main.rs
index cc2d36e..02916b6 100644
--- a/cc_bindings_from_rs/main.rs
+++ b/cc_bindings_from_rs/main.rs
@@ -51,8 +51,8 @@
     }
 }
 
-/// Glue that enables the top-level `main() -> anyhow::Result<()>` to call into
-/// `fn main(cmdline: &Cmdline, tcx: TyCtxt) -> anyhow::Result<()>` in the
+/// Glue that enables the top-level `fn main() -> anyhow::Result<()>` to call
+/// into `fn main(cmdline: &Cmdline, tcx: TyCtxt) -> anyhow::Result<()>` in the
 /// `bindings_main` module.  This mostly wraps and simplifies a subset of APIs
 /// from the `rustc_driver` module.
 mod bindings_driver {
@@ -66,10 +66,7 @@
     /// Wrapper around `rustc_driver::RunCompiler` that exposes a simplified API
     /// (e.g. doesn't take arbitrary `Callbacks` but always calls into
     /// `bindings_main::main`).
-    pub struct RunCompiler<'a> {
-        cmdline: &'a Cmdline,
-        bindings_main_result: Option<anyhow::Result<()>>,
-    }
+    pub struct RunCompiler<'a>(BindingsCallbacks<'a>);
 
     impl<'a> RunCompiler<'a> {
         /// Creates new Rust compiler runner that will
@@ -77,7 +74,7 @@
         /// - pass `cmdline` to `bindings_main::main` (in addition to passing
         ///   `TyCtxt` - see the doc comment of `RunCompiler::run` below).
         pub fn new(cmdline: &'a Cmdline) -> Self {
-            Self { cmdline, bindings_main_result: None }
+            Self(BindingsCallbacks { cmdline, bindings_main_result: None })
         }
 
         /// Runs Rust compiler and then passes the `TyCtxt` of the
@@ -89,7 +86,7 @@
             // fatal errors. We use `catch_fatal_errors` to 1) catch such panics and
             // translate them into a Result, and 2) resume and propagate other panics.
             let rustc_result = rustc_driver::catch_fatal_errors(|| {
-                rustc_driver::RunCompiler::new(self.cmdline.rustc_args(), &mut self).run()
+                rustc_driver::RunCompiler::new(self.0.cmdline.rustc_args(), &mut self.0).run()
             });
 
             // Flatten `Result<Result<T, ...>>` into `Result<T, ...>` (i.e. get the Result
@@ -107,18 +104,24 @@
                 anyhow::format_err!("Errors reported by Rust compiler.")
             });
 
-            // Return either `rustc_result` or `self.bindings_main_result`.
+            // Return either `rustc_result` or `self.0.bindings_main_result`.
             rustc_result.and_then(|()| {
                 assert!(
-                    self.bindings_main_result.is_some(),
-                    "RunCompiler::run_main should have been called by now"
+                    self.0.bindings_main_result.is_some(),
+                    "BindingsCallbacks::run_main should have been called by now"
                 );
-                self.bindings_main_result.unwrap()
+                self.0.bindings_main_result.unwrap()
             })
         }
     }
 
-    impl rustc_driver::Callbacks for RunCompiler<'_> {
+    /// Non-`pub` to avoid exposing `impl rustc_driver::Callbacks`.
+    struct BindingsCallbacks<'a> {
+        cmdline: &'a Cmdline,
+        bindings_main_result: Option<anyhow::Result<()>>,
+    }
+
+    impl rustc_driver::Callbacks for BindingsCallbacks<'_> {
         fn after_analysis<'tcx>(
             &mut self,
             _compiler: &Compiler,