Skip to main content

cognitive_services_speech_sdk_rs/speech/
auto_detect_source_language_config.rs

1use crate::common::PropertyCollection;
2use crate::error::{convert_err, Result};
3use crate::ffi::{
4    add_source_lang_config_to_auto_detect_source_lang_config,
5    auto_detect_source_lang_config_get_property_bag, auto_detect_source_lang_config_release,
6    create_auto_detect_source_lang_config_from_languages,
7    create_auto_detect_source_lang_config_from_open_range,
8    create_auto_detect_source_lang_config_from_source_lang_config, SmartHandle,
9    SPXAUTODETECTSOURCELANGCONFIGHANDLE, SPXPROPERTYBAGHANDLE,
10};
11use crate::speech::SourceLanguageConfig;
12use std::ffi::CString;
13use std::mem::MaybeUninit;
14
15/// AutoDetectSourceLanguageConfig defines auto detection source configuration
16#[derive(Debug)]
17pub struct AutoDetectSourceLanguageConfig {
18    pub handle: SmartHandle<SPXAUTODETECTSOURCELANGCONFIGHANDLE>,
19    pub properties: PropertyCollection,
20}
21
22impl AutoDetectSourceLanguageConfig {
23    /// # Safety
24    /// `handle` must be a valid handle to a live auto detect source language config.
25    unsafe fn from_handle(handle: SPXAUTODETECTSOURCELANGCONFIGHANDLE) -> Result<Self> {
26        unsafe {
27            let mut prop_bag_handle: MaybeUninit<SPXPROPERTYBAGHANDLE> = MaybeUninit::uninit();
28
29            let ret = auto_detect_source_lang_config_get_property_bag(
30                handle,
31                prop_bag_handle.as_mut_ptr(),
32            );
33            convert_err(ret, "AutoDetectSourceLanguageConfig::from_handle error")?;
34
35            let property_bag = PropertyCollection::from_handle(prop_bag_handle.assume_init());
36            Ok(AutoDetectSourceLanguageConfig {
37                handle: SmartHandle::create(
38                    "AutoDetectSourceLanguageConfig",
39                    handle,
40                    auto_detect_source_lang_config_release,
41                ),
42                properties: property_bag,
43            })
44        }
45    }
46
47    /// Creates an instance of the AutoDetectSourceLanguageConfig with source languages.
48    pub fn from_languages(languages: Vec<String>) -> Result<Self> {
49        unsafe {
50            let languages_str = languages.join(",");
51            let c_languages_str = CString::new(languages_str)?;
52            let mut handle: MaybeUninit<SPXAUTODETECTSOURCELANGCONFIGHANDLE> =
53                MaybeUninit::uninit();
54            let ret = create_auto_detect_source_lang_config_from_languages(
55                handle.as_mut_ptr(),
56                c_languages_str.as_ptr(),
57            );
58            convert_err(ret, "AutoDetectSourceLanguageConfig::from_languages error")?;
59            AutoDetectSourceLanguageConfig::from_handle(handle.assume_init())
60        }
61    }
62
63    /// Creates an instance of the AutoDetectSourceLanguageConfig with a list of source language config
64    pub fn from_language_configs(languages: Vec<SourceLanguageConfig>) -> Result<Self> {
65        unsafe {
66            let mut first = true;
67            let mut handle: MaybeUninit<SPXAUTODETECTSOURCELANGCONFIGHANDLE> =
68                MaybeUninit::uninit();
69            for language in &languages {
70                let ret;
71                if first {
72                    first = false;
73                    ret = create_auto_detect_source_lang_config_from_source_lang_config(
74                        handle.as_mut_ptr(),
75                        language.handle.inner(),
76                    );
77                } else {
78                    ret = add_source_lang_config_to_auto_detect_source_lang_config(
79                        handle.assume_init(),
80                        language.handle.inner(),
81                    );
82                }
83                convert_err(
84                    ret,
85                    "AutoDetectSourceLanguageConfig::from_language_configs error",
86                )?;
87            }
88
89            AutoDetectSourceLanguageConfig::from_handle(handle.assume_init())
90        }
91    }
92
93    /// Creates an instance of the AutoDetectSourceLanguageConfig with open range as source languages.
94    pub fn from_open_range() -> Result<Self> {
95        unsafe {
96            let mut handle: MaybeUninit<SPXAUTODETECTSOURCELANGCONFIGHANDLE> =
97                MaybeUninit::uninit();
98            let ret = create_auto_detect_source_lang_config_from_open_range(handle.as_mut_ptr());
99            convert_err(ret, "AutoDetectSourceLanguageConfig::from_open_range error")?;
100            AutoDetectSourceLanguageConfig::from_handle(handle.assume_init())
101        }
102    }
103}