ntdb_unwrap 0.2.1

Decrypt/decoded NTQQ database files.
Documentation
use std::env;

use protobuf::{descriptor::field_descriptor_proto::Type, reflect::MessageDescriptor};
use protobuf_codegen::{Customize, CustomizeCallback};

fn main() {
    struct ProtoGenCallback;
    impl CustomizeCallback for ProtoGenCallback {
        fn message(&self, _message: &MessageDescriptor) -> protobuf_codegen::Customize {
            Customize::default().before("#[derive(::serde::Serialize, ::serde::Deserialize)]")
        }
        fn special_field(&self, _message: &MessageDescriptor, _field: &str) -> Customize {
            Customize::default().before(r#"#[serde(serialize_with = "crate::protos::serde::serialize_special_fields", skip_deserializing, flatten)]"#)
        }
        fn field(&self, field: &protobuf::reflect::FieldDescriptor) -> Customize {
            let mut c = Customize::default();
            let proto = field.proto();
            if proto.type_() == Type::TYPE_MESSAGE && !field.is_repeated() {
                c = c.before(
                    r#"#[serde(serialize_with = "crate::protos::serde::serialize_message_field", deserialize_with = "crate::protos::serde::deserialize_message_field")]"#,
                );
            }
            c
        }
    }
    let mut gen_ = protobuf_codegen::Codegen::new();

    gen_.protoc();
    if let Ok(protoc_path) = env::var("PROTOC") {
        gen_.protoc_path(std::path::PathBuf::from(&protoc_path).as_path());
    }

    gen_.include("src/protos")
        .inputs(["src/protos/message.proto"])
        .cargo_out_dir("protos")
        .customize_callback(ProtoGenCallback);

    gen_.run_from_script();
}