3434
3535#![allow(missing_docs, non_upper_case_globals, non_snake_case)]
3636
37- use super::ScriptExtension;
37+ pub use tables_impl::*;
38+
39+ #[rustfmt::skip]
40+ mod tables_impl {
41+ use crate::ScriptExtension;
42+ '''
43+
44+ # Close `mod impl {`
45+ ending = '''
46+ }
3847'''
3948
4049UNICODE_VERSION = (13 ,0 ,0 )
@@ -239,7 +248,21 @@ def emit_enums(f, script_list, extension_list, longforms):
239248f .write (" /// %s\n pub const %s: ScriptExtension = %s;\n " % (longform ,name ,expr ))
240249f .write ("""}
241250
242- impl Script {
251+ """ )
252+
253+ # Generate implementation for the `Script`
254+ generate_script_impl (f )
255+
256+
257+ def generate_script_impl (f ):
258+ """Generates an `impl Script { ... }` section with all the required functions"""
259+
260+ # Open `impl Script` section.
261+ f .write ("""impl Script {
262+ """ )
263+
264+ # Generate impl of `inner_full_name`.
265+ f .write ("""
243266 #[inline]
244267 pub(crate) fn inner_full_name(self) -> &'static str {
245268 match self {
@@ -251,7 +274,26 @@ def emit_enums(f, script_list, extension_list, longforms):
251274f .write (" Script::%s =>\" %s\" ,\n " % (longforms [script ],longforms [script ]))
252275f .write (""" }
253276 }
277+ """ )
278+
279+ # Generate impl of `inner_from_full_name`.
280+ f .write ("""
281+ #[inline]
282+ pub(crate) fn inner_from_full_name(input: &str) -> Option<Self> {
283+ match input {
284+ "Unknown" => Some(Script::Unknown),
285+ "Common" => Some(Script::Common),
286+ "Inherited" => Some(Script::Inherited),
287+ """ )
288+ for script in script_list :
289+ f .write ("\" %s\" => Some(Script::%s),\n " % (longforms [script ],longforms [script ]))
290+ f .write (" _ => None,\n " )
291+ f .write (""" }
292+ }
293+ """ )
254294
295+ # Generate impl of `inner_short_name`
296+ f .write ("""
255297 #[inline]
256298 pub(crate) fn inner_short_name(self) -> &'static str {
257299 match self {
@@ -263,7 +305,25 @@ def emit_enums(f, script_list, extension_list, longforms):
263305f .write (" Script::%s =>\" %s\" ,\n " % (longforms [script ],script ))
264306f .write (""" }
265307 }
308+ """ )
266309
310+ # Generate impl of `inner_from_short_name`
311+ f .write ("""
312+ #[inline]
313+ pub(crate) fn inner_from_short_name(input: &str) -> Option<Self> {
314+ match input {
315+ "Zyyy" => Some(Script::Common),
316+ "Zinh" => Some(Script::Inherited),
317+ """ )
318+ for script in script_list :
319+ f .write ("\" %s\" => Some(Script::%s),\n " % (script ,longforms [script ]))
320+ f .write (""" _ => None,\n """ )
321+ f .write (""" }
322+ }
323+ """ )
324+
325+ # Generate impl of `for_integer`
326+ f .write ("""
267327 #[inline]
268328 pub(crate) fn for_integer(value: u8) -> Self {
269329 match value {
@@ -273,6 +333,10 @@ def emit_enums(f, script_list, extension_list, longforms):
273333f .write (""" _ => unreachable!(),
274334 }
275335 }
336+ """ )
337+
338+ # Close `impl Script` section
339+ f .write ("""
276340}
277341""" )
278342
@@ -281,8 +345,6 @@ def extension_name(ext):
281345return "script_extensions::%s" % "_" .join ([e .upper ()for e in ext ])
282346
283347
284-
285-
286348if __name__ == "__main__" :
287349r = "tables.rs"
288350if os .path .exists (r ):
@@ -336,3 +398,5 @@ def extension_name(ext):
336398is_pub = False ,pfun = lambda x :"(%s,%s,%s)" % (escape_char (x [0 ]),escape_char (x [1 ]),extension_name (x [2 ])))
337399
338400# emit_table(rf, "FOObar", properties)
401+
402+ rf .write (ending )