use crate::wxa::img::{post_img_data, Pos, WH};
use crate::{error::SdkError::InvalidParams, wechat::WxApiRequestBuilder, SdkResult};
use serde::{Deserialize, Serialize};
pub use crate::wxa::img::ImgData;
#[derive(Debug, Serialize, Deserialize)]
pub struct Id {
pub id: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct VehicleLicense {
pub vehicle_type: String,
pub owner: String,
pub addr: String,
pub use_character: String,
pub model: String,
pub vin: String,
pub engine_num: String,
pub register_date: String,
pub issue_date: String,
pub plate_num_b: String,
pub record: String,
pub passengers_num: String,
pub total_quality: String,
pub totalprepare_quality_quality: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct BusinessLicense {
pub reg_num: String,
pub serial: String,
pub legal_representative: String,
pub enterprise_name: String,
pub type_of_organization: String,
pub address: String,
pub type_of_enterprise: String,
pub business_scope: String,
pub registered_capital: String,
pub paid_in_capital: String,
pub valid_period: String,
pub registered_date: String,
pub cert_position: Pos,
pub img_size: WH,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DriverLicense {
pub id_num: String,
pub name: String,
pub sex: String,
pub address: String,
pub birth_date: String,
pub issue_date: String,
pub car_class: String,
pub valid_from: String,
pub valid_to: String,
pub official_seal: String,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Idcard {
Front(IdcardFront),
Back(IdcardBack),
}
#[derive(Debug, Serialize, Deserialize)]
pub struct IdcardFront {
pub name: String,
pub id: String,
pub addr: String,
pub gender: String,
pub nationality: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct IdcardBack {
pub valid_date: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PrintedText {
pub items: Vec<PrintedTextItem>,
pub img_size: WH,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PrintedTextItem {
pub text: String,
pub pos: Pos,
}
pub struct OcrModule<'a, T: WxApiRequestBuilder>(pub(crate) &'a T);
impl<'a, T: WxApiRequestBuilder> OcrModule<'a, T> {
pub async fn bankcard(&self, data: ImgData) -> SdkResult<Id> {
let url = "https://api.weixin.qq.com/cv/ocr/bankcard";
post_img_data(self.0, url, data).await
}
pub async fn business_license(&self, data: ImgData) -> SdkResult<BusinessLicense> {
let url = "https://api.weixin.qq.com/cv/ocr/bizlicense";
post_img_data(self.0, url, data).await
}
pub async fn driver_license(&self, data: ImgData) -> SdkResult<DriverLicense> {
let url = "https://api.weixin.qq.com/cv/ocr/drivinglicense";
post_img_data(self.0, url, data).await
}
pub async fn idcard(&self, data: ImgData) -> SdkResult<Idcard> {
let url = "https://api.weixin.qq.com/cv/ocr/idcard";
post_img_data(self.0, url, data).await
}
pub async fn printed_text(&self, data: ImgData) -> SdkResult<PrintedText> {
let url = "https://api.weixin.qq.com/cv/ocr/comm";
post_img_data(self.0, url, data).await
}
pub async fn vehicle_license(&self, data: ImgData, type_: &str) -> SdkResult<VehicleLicense> {
let url = match type_ {
"photo" => "https://api.weixin.qq.com/cv/ocr/driving?type=photo",
"scan" => "https://api.weixin.qq.com/cv/ocr/driving?type=scan",
_ => {
return Err(InvalidParams(format!(
"Unknown `type` parameter: {}",
type_
)))
}
};
post_img_data(self.0, url, data).await
}
}