-
Notifications
You must be signed in to change notification settings - Fork 117
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Rust APIが公開するエラーの種類をErrorKind
として表現する
#589
Changes from 1 commit
e5ac602
de3c38b
e8045e4
d4b8b0b
d6489cc
58a3558
1020465
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,59 @@ | ||
use self::engine::{FullContextLabelError, KanaParseError}; | ||
use super::*; | ||
//use engine:: | ||
use duplicate::duplicate_item; | ||
use std::path::PathBuf; | ||
use thiserror::Error; | ||
use uuid::Uuid; | ||
|
||
/// VOICEVOX COREのエラー。 | ||
#[derive(Error, Debug)] | ||
pub enum Error { | ||
#[error(transparent)] | ||
pub struct Error(#[from] ErrorRepr); | ||
Comment on lines
+11
to
+12
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 多分できることがError==ErrorReprだと思うのですが、であれば最初から内部で使う構造体もErrorで良いのではとちょっと思いました。 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. こちらのコメントで納得したのでResolveです! |
||
|
||
#[duplicate_item( | ||
E; | ||
[ LoadModelError ]; | ||
[ FullContextLabelError ]; | ||
[ KanaParseError ]; | ||
)] | ||
impl From<E> for Error { | ||
fn from(err: E) -> Self { | ||
Self(err.into()) | ||
} | ||
} | ||
|
||
impl Error { | ||
/// 対応する[`ErrorKind`]を返す。 | ||
pub fn kind(&self) -> ErrorKind { | ||
match &self.0 { | ||
ErrorRepr::NotLoadedOpenjtalkDict => ErrorKind::NotLoadedOpenjtalkDict, | ||
ErrorRepr::GpuSupport => ErrorKind::GpuSupport, | ||
ErrorRepr::LoadModel(LoadModelError { context, .. }) => match context { | ||
LoadModelErrorKind::OpenZipFile => ErrorKind::OpenZipFile, | ||
LoadModelErrorKind::ReadZipEntry { .. } => ErrorKind::ReadZipEntry, | ||
LoadModelErrorKind::ModelAlreadyLoaded { .. } => ErrorKind::ModelAlreadyLoaded, | ||
LoadModelErrorKind::StyleAlreadyLoaded { .. } => ErrorKind::StyleAlreadyLoaded, | ||
LoadModelErrorKind::InvalidModelData => ErrorKind::InvalidModelData, | ||
}, | ||
ErrorRepr::UnloadedModel { .. } => ErrorKind::UnloadedModel, | ||
ErrorRepr::GetSupportedDevices(_) => ErrorKind::GetSupportedDevices, | ||
ErrorRepr::InvalidStyleId { .. } => ErrorKind::InvalidStyleId, | ||
ErrorRepr::InvalidModelId { .. } => ErrorKind::InvalidModelId, | ||
ErrorRepr::InferenceFailed => ErrorKind::InferenceFailed, | ||
ErrorRepr::ExtractFullContextLabel(_) => ErrorKind::ExtractFullContextLabel, | ||
ErrorRepr::ParseKana(_) => ErrorKind::ParseKana, | ||
ErrorRepr::LoadUserDict(_) => ErrorKind::LoadUserDict, | ||
ErrorRepr::SaveUserDict(_) => ErrorKind::SaveUserDict, | ||
ErrorRepr::UnknownWord(_) => ErrorKind::UnknownWord, | ||
ErrorRepr::UseUserDict(_) => ErrorKind::UseUserDict, | ||
ErrorRepr::InvalidWord(_) => ErrorKind::InvalidWord, | ||
} | ||
} | ||
} | ||
|
||
#[derive(Error, Debug)] | ||
pub(crate) enum ErrorRepr { | ||
#[error("OpenJTalkの辞書が読み込まれていません")] | ||
NotLoadedOpenjtalkDict, | ||
|
||
|
@@ -26,6 +72,7 @@ pub enum Error { | |
#[error("無効なspeaker_idです: {style_id:?}")] | ||
InvalidStyleId { style_id: StyleId }, | ||
|
||
#[allow(dead_code)] // FIXME | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
#[error("無効なmodel_idです: {model_id:?}")] | ||
InvalidModelId { model_id: VoiceModelId }, | ||
|
||
|
@@ -54,6 +101,49 @@ pub enum Error { | |
InvalidWord(InvalidWordError), | ||
} | ||
|
||
/// エラーの種類。 | ||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] | ||
pub enum ErrorKind { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. もうちょっと待ってみて、ライブラリ側やこちら側も安定して来てそうだったら導入を検討しても良さそうなのかなと思いました! |
||
/// open_jtalk辞書ファイルが読み込まれていない。 | ||
NotLoadedOpenjtalkDict, | ||
/// GPUモードがサポートされていない。 | ||
GpuSupport, | ||
/// ZIPファイルを開くことに失敗した。 | ||
OpenZipFile, | ||
/// ZIP内のファイルが読めなかった。 | ||
ReadZipEntry, | ||
/// すでに読み込まれている音声モデルを読み込もうとした。 | ||
ModelAlreadyLoaded, | ||
/// すでに読み込まれているスタイルを読み込もうとした。 | ||
StyleAlreadyLoaded, | ||
/// 無効なモデルデータ。 | ||
InvalidModelData, | ||
/// Modelが読み込まれていない。 | ||
UnloadedModel, | ||
/// サポートされているデバイス情報取得に失敗した。 | ||
GetSupportedDevices, | ||
/// 無効なstyle_idが指定された。 | ||
InvalidStyleId, | ||
/// 無効なmodel_idが指定された。 | ||
InvalidModelId, | ||
/// 推論に失敗した。 | ||
InferenceFailed, | ||
/// コンテキストラベル出力に失敗した。 | ||
ExtractFullContextLabel, | ||
/// AquesTalk風記法のテキストの解析に失敗した。 | ||
ParseKana, | ||
/// ユーザー辞書を読み込めなかった。 | ||
LoadUserDict, | ||
/// ユーザー辞書を書き込めなかった。 | ||
SaveUserDict, | ||
/// ユーザー辞書に単語が見つからなかった。 | ||
UnknownWord, | ||
/// OpenJTalkのユーザー辞書の設定に失敗した。 | ||
UseUserDict, | ||
/// ユーザー辞書の単語のバリデーションに失敗した。 | ||
InvalidWord, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ここのdocは現状の |
||
} | ||
|
||
pub(crate) type LoadModelResult<T> = std::result::Result<T, LoadModelError>; | ||
|
||
/// 音声モデル読み込みのエラー。 | ||
|
@@ -62,21 +152,15 @@ pub(crate) type LoadModelResult<T> = std::result::Result<T, LoadModelError>; | |
"`{path}`の読み込みに失敗しました: {context}{}", | ||
source.as_ref().map(|e| format!(": {e}")).unwrap_or_default()) | ||
] | ||
pub struct LoadModelError { | ||
pub(crate) struct LoadModelError { | ||
pub(crate) path: PathBuf, | ||
pub(crate) context: LoadModelErrorKind, | ||
#[source] | ||
pub(crate) source: Option<anyhow::Error>, | ||
} | ||
|
||
impl LoadModelError { | ||
pub fn context(&self) -> &LoadModelErrorKind { | ||
&self.context | ||
} | ||
} | ||
|
||
#[derive(derive_more::Display, Debug)] | ||
pub enum LoadModelErrorKind { | ||
pub(crate) enum LoadModelErrorKind { | ||
#[display(fmt = "ZIPファイルとして開くことができませんでした")] | ||
OpenZipFile, | ||
#[display(fmt = "`{filename}`を読み取れませんでした")] | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
各エラー型の可視性の降格により、シグネチャにそれらのエラー型が表われる関数がコンパイルエラーになるので同様に可視性を調整。
これによりコード中に特に理由無く
pub
とpub(crate)
が混在することになりますが、Rust API内のアイテムの可視性については元々深く考えられていないということで今のところはよいかなと思いました。There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
混じってしまうのはまあありなのかなと思いました。
ただ混じってしまうぐらいなんだったら、今は全部統一的に
pub
にしておいて、pub(crate)
にする機会を別途作成してそこで一気に変更とかもありかもとか思いました。まあでもせっかく書いちゃったんだし、こちらのプルリクエストの形で一旦マージするのもありかもです。
あまり強い意見ではないです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
#594 を作りました。
(初心者歓迎タスクにしました)