lua_protobuf_rs/descriptor/
file_descriptor.rs

1use anyhow::anyhow;
2use derive_more::{Deref, From, Into};
3use mlua::prelude::LuaUserData;
4use mlua::UserDataMethods;
5use protobuf::reflect::FileDescriptor;
6
7use crate::descriptor::enum_descriptor::LuaEnumDescriptor;
8use crate::descriptor::field_descriptor::LuaFieldDescriptor;
9use crate::descriptor::message_descriptor::LuaMessageDescriptor;
10use crate::descriptor::service_descriptor::LuaServiceDescriptor;
11use crate::descriptor_proto::file_descriptor_proto::LuaFileDescriptorProto;
12use crate::syntax::LuaSyntax;
13
14#[derive(Clone, PartialEq, Eq, Hash, Debug, Deref, From, Into, mlua::FromLua)]
15pub struct LuaFileDescriptor(pub FileDescriptor);
16
17impl LuaUserData for LuaFileDescriptor {
18    fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
19        methods.add_method("name", |_, this, ()| {
20            Ok(this.name().to_string())
21        });
22
23        methods.add_method("package", |_, this, ()| {
24            Ok(this.package().to_string())
25        });
26        
27        methods.add_method("syntax", |_, this, ()| {
28            Ok(LuaSyntax(this.syntax()))
29        });
30
31        methods.add_method("messages", |_, this, ()| {
32            let messages: Vec<LuaMessageDescriptor> = this.messages().map(From::from).collect();
33            Ok(messages)
34        });
35
36
37        methods.add_method("enums", |_, this, ()| {
38            let enums: Vec<LuaEnumDescriptor> = this.enums().map(From::from).collect();
39            Ok(enums)
40        });
41
42
43        methods.add_method("services", |_, this, ()| {
44            let services: Vec<LuaServiceDescriptor> = this.services().map(From::from).collect();
45            Ok(services)
46        });
47
48        methods.add_method("extensions", |_, this, ()| {
49            let descriptors: Vec<LuaFieldDescriptor> = this.extensions().map(From::from).collect();
50            Ok(descriptors)
51        });
52
53        methods.add_method("message_by_package_relative_name", |_, this, name: String| {
54            let descriptor: Option<LuaMessageDescriptor> = this.message_by_package_relative_name(name.as_str()).map(From::from);
55            Ok(descriptor)
56        });
57        
58        methods.add_method("enum_by_package_relative_name", |_, this, name: String| {
59            let descriptor: Option<LuaEnumDescriptor> = this.enum_by_package_relative_name(name.as_str()).map(From::from);
60            Ok(descriptor)
61        });
62
63        methods.add_method("message_by_full_name", |_, this, name: String| {
64            let descriptor: Option<LuaMessageDescriptor> = this.message_by_full_name(name.as_str()).map(From::from);
65            Ok(descriptor)
66        });
67
68        methods.add_method("enum_by_full_name", |_, this, name: String| {
69            let descriptor: Option<LuaEnumDescriptor> = this.enum_by_full_name(name.as_str()).map(From::from);
70            Ok(descriptor)
71        });
72
73        methods.add_function("new_dynamic", |_, (proto, dependencies): (LuaFileDescriptorProto, Vec<LuaFileDescriptor>)| {
74            let descriptor: LuaFileDescriptor = FileDescriptor::new_dynamic(
75                proto.into(),
76                dependencies.into_iter().map(Into::into).collect::<Vec<FileDescriptor>>().as_slice())
77                .map_err(|e| anyhow!(e))?.into();
78            Ok(descriptor)
79        });
80
81        methods.add_function("new_dynamic_fds", |_, (protos, dependencies): (Vec<LuaFileDescriptorProto>, Vec<LuaFileDescriptor>)| {
82            let descriptors: Vec<LuaFileDescriptor> = FileDescriptor::new_dynamic_fds(
83                protos.into_iter().map(Into::into).collect(),
84                dependencies.into_iter().map(Into::into).collect::<Vec<FileDescriptor>>().as_slice())
85                .map_err(|e| anyhow!(e))?.into_iter().map(Into::into).collect();
86            Ok(descriptors)
87        });
88        
89        methods.add_method("proto", |_, this, ()| {
90            Ok::<LuaFileDescriptorProto, _>(this.proto().clone().into())
91        });
92
93        methods.add_method("deps", |_, this, ()| {
94            let descriptors: Vec<LuaFileDescriptor> = this.deps().iter().map(Clone::clone).map(From::from).collect();
95            Ok(descriptors)
96        });
97        
98        methods.add_method("public_deps", |_, this, ()| {
99            let descriptors: Vec<LuaFileDescriptor> = this.public_deps().map(From::from).collect();
100            Ok(descriptors)
101        });
102    }
103}