lua_protobuf_rs/descriptor/
file_descriptor.rs

1use 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}