Le client Cloud Storage des bibliothèques clientes Cloud pour Rust écrit des objets en extrayant des fragments de charge utile d'un type qui implémente la caractéristique StreamingSource.
Si votre application détecte une condition d'erreur lors de la génération ou de la diffusion de données, le renvoi d'une erreur à partir de votre implémentation StreamingSource empêche la bibliothèque cliente de finaliser la création de l'objet.
Ce document explique comment définir un type d'erreur personnalisé et implémenter StreamingSource pour renvoyer cette erreur en cours de flux. Vous vérifiez également que l'échec de l'importation renvoie votre erreur sans créer l'objet. Si vous débutez avec la bibliothèque cliente, consultez d'abord Utiliser Cloud Storage avec Rust.
Avant de commencer
Avant d'exécuter le code de ce document, assurez-vous de remplir les conditions préalables suivantes :
- Créez ou sélectionnez un projetGoogle Cloud pour lequel la facturation est activée.
- Créez un bucket Cloud Storage dans votre projet.
- Configurez les identifiants par défaut de l'application et attribuez à votre compte principal un rôle Identity and Access Management (IAM) avec l'autorisation de créer des objets dans le bucket, par exemple "Utilisateur d'objets Storage" (
roles/storage.objectUser).
Dépendances
Ajoutez la bibliothèque cliente Cloud Storage et les crates compatibles à votre fichier Cargo.toml :
cargo add google-cloud-storage anyhow bytes
Créer un type d'erreur personnalisé
Pour annuler l'écriture d'un objet avant sa finalisation, votre implémentation StreamingSource doit renvoyer une erreur qui implémente std::error::Error + Send + Sync + 'static. Vous pouvez utiliser n'importe quel type d'erreur existant qui respecte ces limites ou définir une énumération personnalisée pour votre application. Pour définir une énumération d'erreur personnalisée, procédez comme suit :
Définissez une énumération d'erreur personnalisée (
MyError) :Implémentez la caractéristique
Errorstandard afin que la bibliothèque cliente puisse conserver votre erreur en tant que cause sous-jacente :Implémentez la caractéristique
Displayrequise parstd::error::Error:
Implémenter une source de streaming personnalisée
Ensuite, créez un type qui génère des fragments synthétiques et renvoie une erreur après 41 fragments, de sorte que l'importation s'arrête avant la fin. Procédez comme suit :
Définissez une structure pour suivre le compteur de fragments :
Implémentez
StreamingSourcepourMySource, en associanttype Error = MyErroret en renvoyantSome(Err(MyError::ExpectedProblem))à l'itération 42 :
Lorsque next renvoie Some(Err(...)), la bibliothèque cliente arrête de lire la source et annule la requête d'écriture sans finaliser l'objet.
Tenter d'importer et inspecter l'erreur
Après avoir implémenté StreamingSource, tentez d'écrire un objet mis en mémoire tampon et vérifiez que le client renvoie une erreur de sérialisation encapsulant MyError. Étant donné que MySource est une source à un seul passage qui n'implémente pas Seek, démarrez l'écriture avec send_buffered au lieu de send_unbuffered.
Dans une fonction async qui accepte bucket_name au format projects/_/buckets/BUCKET_ID, procédez comme suit :
Initialisez un client
Storage:Démarrez l'écriture d'objet mis en mémoire tampon en utilisant
MySource::default()comme source de charge utile :Vérifiez que l'importation échoue avec une erreur de sérialisation dont l'erreur source est
MyError:Renvoyez
Ok(())pour terminer la fonction :
Lorsque vous exécutez attempt_upload, un message Upload result Err(...) contenant MyError::ExpectedProblem s'affiche. Les assertions vérifient que le client a arrêté l'importation et a renvoyé une erreur de sérialisation encapsulant MyError. Comme l'écriture a été annulée avant la finalisation, Cloud Storage ne crée pas l'objet expect-error dans le bucket.
Effectuer un nettoyage
Même si l'écriture annulée ne crée pas d'objet, supprimez tous les objets de test que vous avez créés pour ce document. La suppression des ressources de test une fois que vous avez terminé vous évite des frais récurrents.
Compléter le code
L'exemple suivant combine toutes les étapes précédentes dans un module complet :
Étapes suivantes
- Découvrez comment envoyer des données lors des écritures d'objets Cloud Storage.