lua_protobuf_rs/descriptor/
file_descriptor.rs1use anyhow::anyhow;
2use derive_more::{Deref, From, Into};
3use mlua::UserDataMethods;
4use mlua::prelude::LuaUserData;
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, ()| Ok(this.name().to_string()));
20
21 methods.add_method("package", |_, this, ()| Ok(this.package().to_string()));
22
23 methods.add_method("syntax", |_, this, ()| Ok(LuaSyntax(this.syntax())));
24
25 methods.add_method("messages", |_, this, ()| {
26 let messages: Vec<LuaMessageDescriptor> = this.messages().map(From::from).collect();
27 Ok(messages)
28 });
29
30 methods.add_method("enums", |_, this, ()| {
31 let enums: Vec<LuaEnumDescriptor> = this.enums().map(From::from).collect();
32 Ok(enums)
33 });
34
35 methods.add_method("services", |_, this, ()| {
36 let services: Vec<LuaServiceDescriptor> = this.services().map(From::from).collect();
37 Ok(services)
38 });
39
40 methods.add_method("extensions", |_, this, ()| {
41 let descriptors: Vec<LuaFieldDescriptor> = this.extensions().map(From::from).collect();
42 Ok(descriptors)
43 });
44
45 methods.add_method(
46 "message_by_package_relative_name",
47 |_, this, name: String| {
48 let descriptor: Option<LuaMessageDescriptor> = this
49 .message_by_package_relative_name(name.as_str())
50 .map(From::from);
51 Ok(descriptor)
52 },
53 );
54
55 methods.add_method("enum_by_package_relative_name", |_, this, name: String| {
56 let descriptor: Option<LuaEnumDescriptor> = this
57 .enum_by_package_relative_name(name.as_str())
58 .map(From::from);
59 Ok(descriptor)
60 });
61
62 methods.add_method("message_by_full_name", |_, this, name: String| {
63 let descriptor: Option<LuaMessageDescriptor> =
64 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> =
70 this.enum_by_full_name(name.as_str()).map(From::from);
71 Ok(descriptor)
72 });
73
74 methods.add_function(
75 "new_dynamic",
76 |_, (proto, dependencies): (LuaFileDescriptorProto, Vec<LuaFileDescriptor>)| {
77 let descriptor: LuaFileDescriptor = FileDescriptor::new_dynamic(
78 proto.into(),
79 dependencies
80 .into_iter()
81 .map(Into::into)
82 .collect::<Vec<FileDescriptor>>()
83 .as_slice(),
84 )
85 .map_err(|e| anyhow!(e))?
86 .into();
87 Ok(descriptor)
88 },
89 );
90
91 methods.add_function(
92 "new_dynamic_fds",
93 |_, (protos, dependencies): (Vec<LuaFileDescriptorProto>, Vec<LuaFileDescriptor>)| {
94 let descriptors: Vec<LuaFileDescriptor> = FileDescriptor::new_dynamic_fds(
95 protos.into_iter().map(Into::into).collect(),
96 dependencies
97 .into_iter()
98 .map(Into::into)
99 .collect::<Vec<FileDescriptor>>()
100 .as_slice(),
101 )
102 .map_err(|e| anyhow!(e))?
103 .into_iter()
104 .map(Into::into)
105 .collect();
106 Ok(descriptors)
107 },
108 );
109
110 methods.add_method("proto", |_, this, ()| {
111 Ok::<LuaFileDescriptorProto, _>(this.proto().clone().into())
112 });
113
114 methods.add_method("deps", |_, this, ()| {
115 let descriptors: Vec<LuaFileDescriptor> = this
116 .deps()
117 .iter()
118 .map(Clone::clone)
119 .map(From::from)
120 .collect();
121 Ok(descriptors)
122 });
123
124 methods.add_method("public_deps", |_, this, ()| {
125 let descriptors: Vec<LuaFileDescriptor> = this.public_deps().map(From::from).collect();
126 Ok(descriptors)
127 });
128 }
129}