Serialize and deserialize access specifiers.

PiperOrigin-RevId: 397258078
diff --git a/rs_bindings_from_cc/ir.cc b/rs_bindings_from_cc/ir.cc
index 469a2c5..44f0e76 100644
--- a/rs_bindings_from_cc/ir.cc
+++ b/rs_bindings_from_cc/ir.cc
@@ -60,10 +60,22 @@
   return result;
 }
 
+static std::string AccessToString(AccessSpecifier access) {
+  switch (access) {
+    case kPublic:
+      return "Public";
+    case kProtected:
+      return "Protected";
+    case kPrivate:
+      return "Private";
+  }
+}
+
 nlohmann::json Field::ToJson() const {
   nlohmann::json result;
   result["type"] = type.ToJson();
   result["identifier"] = identifier.ToJson();
+  result["access"] = AccessToString(access);
   return result;
 }
 
diff --git a/rs_bindings_from_cc/ir.rs b/rs_bindings_from_cc/ir.rs
index da12c4c..4cff1a7 100644
--- a/rs_bindings_from_cc/ir.rs
+++ b/rs_bindings_from_cc/ir.rs
@@ -45,11 +45,19 @@
     pub is_inline: bool,
 }
 
+#[derive(Debug, PartialEq, Eq, Hash, Copy, Clone, Deserialize)]
+pub enum AccessSpecifier {
+    Public,
+    Protected,
+    Private,
+}
+
 #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)]
 pub struct Field {
     pub identifier: Identifier,
     #[serde(rename(deserialize = "type"))]
     pub type_: IRType,
+    pub access: AccessSpecifier,
 }
 
 #[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize)]
@@ -90,17 +98,29 @@
             ],
             "records": [
                 {
-                    "identifier": {"identifier": "Cons" },
+                    "identifier": {"identifier": "SomeStruct" },
                     "fields": [
                         {
-                            "identifier": {"identifier": "car" },
-                            "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] }
+                            "identifier": {"identifier": "public_int" },
+                            "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+                            "access": "Public"
                         },
                         {
-                            "identifier": {"identifier": "cdr" },
+                            "identifier": {"identifier": "protected_int" },
+                            "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+                            "access": "Protected"
+                        },
+                        {
+                            "identifier": {"identifier": "private_int" },
+                            "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+                            "access": "Private"
+                        },
+                        {
+                            "identifier": {"identifier": "ptr" },
                             "type": {"rs_name": "*mut", "cc_name": "*", "type_params": [
-                                {"rs_name": "Cons", "cc_name": "Cons", "type_params": []}
-                            ] }
+                                {"rs_name": "SomeStruct", "cc_name": "SomeStruct", "type_params": []}
+                            ] },
+                            "access": "Public"
                         }
                     ]
                 }
@@ -129,27 +149,47 @@
                 is_inline: false,
             }],
             records: vec![Record {
-                identifier: Identifier { identifier: "Cons".to_string() },
+                identifier: Identifier { identifier: "SomeStruct".to_string() },
                 fields: vec![
                     Field {
-                        identifier: Identifier { identifier: "car".to_string() },
+                        identifier: Identifier { identifier: "public_int".to_string() },
                         type_: IRType {
                             rs_name: "i32".to_string(),
                             cc_name: "int".to_string(),
                             type_params: vec![],
                         },
+                        access: AccessSpecifier::Public,
                     },
                     Field {
-                        identifier: Identifier { identifier: "cdr".to_string() },
+                        identifier: Identifier { identifier: "protected_int".to_string() },
+                        type_: IRType {
+                            rs_name: "i32".to_string(),
+                            cc_name: "int".to_string(),
+                            type_params: vec![],
+                        },
+                        access: AccessSpecifier::Protected,
+                    },
+                    Field {
+                        identifier: Identifier { identifier: "private_int".to_string() },
+                        type_: IRType {
+                            rs_name: "i32".to_string(),
+                            cc_name: "int".to_string(),
+                            type_params: vec![],
+                        },
+                        access: AccessSpecifier::Private,
+                    },
+                    Field {
+                        identifier: Identifier { identifier: "ptr".to_string() },
                         type_: IRType {
                             rs_name: "*mut".to_string(),
                             cc_name: "*".to_string(),
                             type_params: vec![IRType {
-                                rs_name: "Cons".to_string(),
-                                cc_name: "Cons".to_string(),
+                                rs_name: "SomeStruct".to_string(),
+                                cc_name: "SomeStruct".to_string(),
                                 type_params: vec![],
                             }],
                         },
+                        access: AccessSpecifier::Public,
                     },
                 ],
             }],
diff --git a/rs_bindings_from_cc/ir_test.cc b/rs_bindings_from_cc/ir_test.cc
index 175daf6..c54789d 100644
--- a/rs_bindings_from_cc/ir_test.cc
+++ b/rs_bindings_from_cc/ir_test.cc
@@ -48,12 +48,19 @@
                 "identifier": {"identifier": "SomeStruct" },
                 "fields": [
                   {
-                    "identifier": {"identifier": "first_field" },
-                    "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] }
+                    "identifier": {"identifier": "public_int" },
+                    "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+                    "access": "Public"
                   },
                   {
-                    "identifier": {"identifier": "second_field" },
-                    "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] }
+                    "identifier": {"identifier": "protected_int" },
+                    "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+                    "access": "Protected"
+                  },
+                  {
+                    "identifier": {"identifier": "private_int" },
+                    "type": {"rs_name": "i32", "cc_name": "int", "type_params": [] },
+                    "access": "Private"
                   }
                 ]
               }
@@ -69,10 +76,15 @@
           .is_inline = false}},
       .records = {Record(Identifier("SomeStruct"),
                          {
-                             Field{.identifier = Identifier("first_field"),
-                                   .type = Type{"i32", "int"}},
-                             Field{.identifier = Identifier("second_field"),
-                                   .type = Type{"i32", "int"}},
+                             Field{.identifier = Identifier("public_int"),
+                                   .type = Type{"i32", "int"},
+                                   .access = kPublic},
+                             Field{.identifier = Identifier("protected_int"),
+                                   .type = Type{"i32", "int"},
+                                   .access = kProtected},
+                             Field{.identifier = Identifier("private_int"),
+                                   .type = Type{"i32", "int"},
+                                   .access = kPrivate},
                          })}};
   EXPECT_EQ(ir.ToJson(), expected);
 }
diff --git a/rs_bindings_from_cc/src_code_gen.rs b/rs_bindings_from_cc/src_code_gen.rs
index 2b95612..bd089fc 100644
--- a/rs_bindings_from_cc/src_code_gen.rs
+++ b/rs_bindings_from_cc/src_code_gen.rs
@@ -392,6 +392,7 @@
                             cc_name: "int".to_string(),
                             type_params: vec![],
                         },
+                        access: AccessSpecifier::Public,
                     },
                     Field {
                         identifier: Identifier { identifier: "second_field".to_string() },
@@ -400,6 +401,7 @@
                             cc_name: "int".to_string(),
                             type_params: vec![],
                         },
+                        access: AccessSpecifier::Public,
                     },
                 ],
             }],