diff --git a/tools/aconfig/aconfig/src/storage/flag_table.rs b/tools/aconfig/aconfig/src/storage/flag_table.rs
index 4dd177c..1381e89 100644
--- a/tools/aconfig/aconfig/src/storage/flag_table.rs
+++ b/tools/aconfig/aconfig/src/storage/flag_table.rs
@@ -74,13 +74,7 @@
                 // should come from the parsed flag, and we will set the flag_type bit
                 // mask properly.
                 let flag_type = 1;
-                Ok(Self::new(
-                    package.package_id,
-                    pf.name(),
-                    flag_type,
-                    *fid,
-                    num_buckets,
-                ))
+                Ok(Self::new(package.package_id, pf.name(), flag_type, *fid, num_buckets))
             })
             .collect::<Result<Vec<_>>>()
     }
@@ -112,8 +106,11 @@
     let mut offset = header.node_offset;
     for i in 0..node_wrappers.len() {
         let node_bucket_idx = node_wrappers[i].bucket_index;
-        let next_node_bucket_idx =
-            if i + 1 < node_wrappers.len() { Some(node_wrappers[i + 1].bucket_index) } else { None };
+        let next_node_bucket_idx = if i + 1 < node_wrappers.len() {
+            Some(node_wrappers[i + 1].bucket_index)
+        } else {
+            None
+        };
 
         if buckets[node_bucket_idx as usize].is_none() {
             buckets[node_bucket_idx as usize] = Some(offset);
@@ -127,11 +124,8 @@
         }
     }
 
-    let table = FlagTable {
-        header,
-        buckets,
-        nodes: node_wrappers.into_iter().map(|nw| nw.node).collect(),
-    };
+    let table =
+        FlagTable { header, buckets, nodes: node_wrappers.into_iter().map(|nw| nw.node).collect() };
 
     Ok(table)
 }
diff --git a/tools/aconfig/aconfig/src/storage/package_table.rs b/tools/aconfig/aconfig/src/storage/package_table.rs
index 5ce6165..4c08129 100644
--- a/tools/aconfig/aconfig/src/storage/package_table.rs
+++ b/tools/aconfig/aconfig/src/storage/package_table.rs
@@ -17,8 +17,7 @@
 use anyhow::Result;
 
 use aconfig_storage_file::{
-    get_table_size, PackageTable, PackageTableHeader, PackageTableNode,
-    FILE_VERSION,
+    get_table_size, PackageTable, PackageTableHeader, PackageTableNode, FILE_VERSION,
 };
 
 use crate::storage::FlagPackage;
@@ -61,10 +60,8 @@
     let num_buckets = get_table_size(num_packages)?;
     let mut header = new_header(container, num_packages);
     let mut buckets = vec![None; num_buckets as usize];
-    let mut node_wrappers: Vec<_> = packages
-        .iter()
-        .map(|pkg| PackageTableNodeWrapper::new(pkg, num_buckets))
-        .collect();
+    let mut node_wrappers: Vec<_> =
+        packages.iter().map(|pkg| PackageTableNodeWrapper::new(pkg, num_buckets)).collect();
 
     // initialize all header fields
     header.bucket_offset = header.as_bytes().len() as u32;
@@ -79,8 +76,11 @@
     let mut offset = header.node_offset;
     for i in 0..node_wrappers.len() {
         let node_bucket_idx = node_wrappers[i].bucket_index;
-        let next_node_bucket_idx =
-            if i + 1 < node_wrappers.len() { Some(node_wrappers[i + 1].bucket_index) } else { None };
+        let next_node_bucket_idx = if i + 1 < node_wrappers.len() {
+            Some(node_wrappers[i + 1].bucket_index)
+        } else {
+            None
+        };
 
         if buckets[node_bucket_idx as usize].is_none() {
             buckets[node_bucket_idx as usize] = Some(offset);
diff --git a/tools/aconfig/aconfig_protos/src/lib.rs b/tools/aconfig/aconfig_protos/src/lib.rs
index ef16e06..8f5667f 100644
--- a/tools/aconfig/aconfig_protos/src/lib.rs
+++ b/tools/aconfig/aconfig_protos/src/lib.rs
@@ -150,10 +150,7 @@
         ensure_required_fields!("flag declarations", pdf, "package");
         // TODO(b/312769710): Make the container field required.
 
-        ensure!(
-            is_valid_package_ident(pdf.package()),
-            "bad flag declarations: bad package"
-        );
+        ensure!(is_valid_package_ident(pdf.package()), "bad flag declarations: bad package");
         ensure!(
             !pdf.has_container() || is_valid_container_ident(pdf.container()),
             "bad flag declarations: bad container"
@@ -898,10 +895,7 @@
 "#;
         let parsed_flags = try_from_binary_proto_from_text_proto(text_proto).unwrap();
         let parsed_flag = &parsed_flags.parsed_flag[0];
-        assert_eq!(
-            crate::parsed_flag::path_to_declaration(parsed_flag),
-            "flags.declarations"
-        );
+        assert_eq!(crate::parsed_flag::path_to_declaration(parsed_flag), "flags.declarations");
     }
 
     #[test]
diff --git a/tools/aconfig/aconfig_storage_file/src/flag_table.rs b/tools/aconfig/aconfig_storage_file/src/flag_table.rs
index 99d5a60..dfbd9de 100644
--- a/tools/aconfig/aconfig_storage_file/src/flag_table.rs
+++ b/tools/aconfig/aconfig_storage_file/src/flag_table.rs
@@ -17,7 +17,7 @@
 //! flag table module defines the flag table file format and methods for serialization
 //! and deserialization
 
-use crate::{read_str_from_bytes, read_u16_from_bytes, read_u32_from_bytes, get_bucket_index};
+use crate::{get_bucket_index, read_str_from_bytes, read_u16_from_bytes, read_u32_from_bytes};
 use anyhow::{anyhow, Result};
 
 /// Flag table header struct
@@ -175,8 +175,7 @@
 
     loop {
         let interpreted_node = FlagTableNode::from_bytes(&buf[flag_node_offset..])?;
-        if interpreted_node.package_id == package_id &&
-            interpreted_node.flag_name == flag {
+        if interpreted_node.package_id == package_id && interpreted_node.flag_name == flag {
             return Ok(Some(interpreted_node.flag_id));
         }
         match interpreted_node.next_offset {
@@ -184,7 +183,6 @@
             None => return Ok(None),
         }
     }
-
 }
 
 #[cfg(test)]
@@ -200,13 +198,7 @@
             flag_id: u16,
             next_offset: Option<u32>,
         ) -> Self {
-            Self {
-                package_id,
-                flag_name: flag_name.to_string(),
-                flag_type,
-                flag_id,
-                next_offset,
-            }
+            Self { package_id, flag_name: flag_name.to_string(), flag_type, flag_id, next_offset }
         }
     }
 
@@ -288,9 +280,7 @@
         ];
         for (package_id, flag_name, expected_offset) in baseline.into_iter() {
             let flag_offset =
-                find_flag_offset(&flag_table[..], package_id, flag_name)
-                .unwrap()
-                .unwrap();
+                find_flag_offset(&flag_table[..], package_id, flag_name).unwrap().unwrap();
             assert_eq!(flag_offset, expected_offset);
         }
     }
@@ -299,11 +289,9 @@
     // this test point locks down table query of a non exist flag
     fn test_not_existed_flag_query() {
         let flag_table = create_test_flag_table().unwrap().as_bytes();
-        let flag_offset =
-            find_flag_offset(&flag_table[..], 1, "disabled_fixed_ro").unwrap();
+        let flag_offset = find_flag_offset(&flag_table[..], 1, "disabled_fixed_ro").unwrap();
         assert_eq!(flag_offset, None);
-        let flag_offset =
-            find_flag_offset(&flag_table[..], 2, "disabled_rw").unwrap();
+        let flag_offset = find_flag_offset(&flag_table[..], 2, "disabled_rw").unwrap();
         assert_eq!(flag_offset, None);
     }
 
@@ -313,8 +301,7 @@
         let mut table = create_test_flag_table().unwrap();
         table.header.version = crate::FILE_VERSION + 1;
         let flag_table = table.as_bytes();
-        let error = find_flag_offset(&flag_table[..], 0, "enabled_ro")
-            .unwrap_err();
+        let error = find_flag_offset(&flag_table[..], 0, "enabled_ro").unwrap_err();
         assert_eq!(
             format!("{:?}", error),
             format!(
diff --git a/tools/aconfig/aconfig_storage_file/src/flag_value.rs b/tools/aconfig/aconfig_storage_file/src/flag_value.rs
index c8b52a9..bb8892d 100644
--- a/tools/aconfig/aconfig_storage_file/src/flag_value.rs
+++ b/tools/aconfig/aconfig_storage_file/src/flag_value.rs
@@ -146,9 +146,7 @@
         let flag_value_list = create_test_flag_value_list().unwrap().as_bytes();
         let baseline: Vec<bool> = vec![false, true, false, false, true, true, false, true];
         for (offset, expected_value) in baseline.into_iter().enumerate() {
-            let flag_value =
-                get_boolean_flag_value(&flag_value_list[..], offset as u32)
-                .unwrap();
+            let flag_value = get_boolean_flag_value(&flag_value_list[..], offset as u32).unwrap();
             assert_eq!(flag_value, expected_value);
         }
     }
@@ -157,12 +155,8 @@
     // this test point locks down query beyond the end of boolean section
     fn test_boolean_out_of_range() {
         let flag_value_list = create_test_flag_value_list().unwrap().as_bytes();
-        let error = get_boolean_flag_value(&flag_value_list[..], 8)
-            .unwrap_err();
-        assert_eq!(
-            format!("{:?}", error),
-            "Flag value offset goes beyond the end of the file."
-        );
+        let error = get_boolean_flag_value(&flag_value_list[..], 8).unwrap_err();
+        assert_eq!(format!("{:?}", error), "Flag value offset goes beyond the end of the file.");
     }
 
     #[test]
@@ -171,8 +165,7 @@
         let mut value_list = create_test_flag_value_list().unwrap();
         value_list.header.version = crate::FILE_VERSION + 1;
         let flag_value = value_list.as_bytes();
-        let error = get_boolean_flag_value(&flag_value[..], 4)
-            .unwrap_err();
+        let error = get_boolean_flag_value(&flag_value[..], 4).unwrap_err();
         assert_eq!(
             format!("{:?}", error),
             format!(
diff --git a/tools/aconfig/aconfig_storage_file/src/test_utils.rs b/tools/aconfig/aconfig_storage_file/src/test_utils.rs
index e1fb6c7..21bfe5c 100644
--- a/tools/aconfig/aconfig_storage_file/src/test_utils.rs
+++ b/tools/aconfig/aconfig_storage_file/src/test_utils.rs
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
+use crate::protos::ProtoStorageFiles;
 use anyhow::Result;
 use protobuf::Message;
-use crate::protos::ProtoStorageFiles;
 
 pub fn get_binary_storage_proto_bytes(text_proto: &str) -> Result<Vec<u8>> {
     let storage_files: ProtoStorageFiles = protobuf::text_format::parse_from_str(text_proto)?;
diff --git a/tools/aconfig/printflags/src/main.rs b/tools/aconfig/printflags/src/main.rs
index 7fcde61..a0c9ee8 100644
--- a/tools/aconfig/printflags/src/main.rs
+++ b/tools/aconfig/printflags/src/main.rs
@@ -17,7 +17,7 @@
 //! `printflags` is a device binary to print feature flags.
 
 use aconfig_protos::ProtoFlagState as State;
-use aconfig_protos::ProtoParsedFlags as ProtoParsedFlags;
+use aconfig_protos::ProtoParsedFlags;
 use anyhow::{bail, Context, Result};
 use regex::Regex;
 use std::collections::BTreeMap;
