lua_protobuf_rs/descriptor/
file_descriptor.rs1use 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}