From f0bfa8ec478a341185407ee971806e1129ddca6e Mon Sep 17 00:00:00 2001 From: trevyn <230691+trevyn@users.noreply.github.com> Date: Sat, 20 Jul 2024 18:35:59 +0400 Subject: [PATCH] remove deepgram --- Cargo.toml | 1 - .../.github/ISSUE_TEMPLATE/bug_report.md | 30 - .../.github/ISSUE_TEMPLATE/config.yml | 4 - .../.github/ISSUE_TEMPLATE/feature_request.md | 24 - .../.github/PULL_REQUEST_TEMPLATE.md | 37 - deepgram-rust-sdk/.github/workflows/ci.yaml | 93 - deepgram-rust-sdk/.gitignore | 2 - deepgram-rust-sdk/CHANGELOG.md | 32 - deepgram-rust-sdk/CODE_OF_CONDUCT.md | 3 - deepgram-rust-sdk/CONTRIBUTING.md | 49 - deepgram-rust-sdk/Cargo.toml | 36 - deepgram-rust-sdk/LICENSE | 21 - deepgram-rust-sdk/README.md | 58 - deepgram-rust-sdk/examples/billing.rs | 27 - deepgram-rust-sdk/examples/callback.rs | 38 - deepgram-rust-sdk/examples/invitations.rs | 19 - deepgram-rust-sdk/examples/keys.rs | 31 - .../make_prerecorded_request_builder.rs | 45 - deepgram-rust-sdk/examples/members.rs | 28 - .../examples/microphone_stream.rs | 112 -- .../Bueller-Life-moves-pretty-fast.mp3 | Bin 281957 -> 0 bytes .../examples/prerecorded_from_file/main.rs | 39 - .../examples/prerecorded_from_url.rs | 36 - deepgram-rust-sdk/examples/projects.rs | 32 - deepgram-rust-sdk/examples/scopes.rs | 31 - deepgram-rust-sdk/examples/simple_stream.rs | 29 - deepgram-rust-sdk/examples/usage.rs | 43 - deepgram-rust-sdk/rustfmt.toml | 1 - deepgram-rust-sdk/src/billing.rs | 135 -- deepgram-rust-sdk/src/billing/response.rs | 55 - deepgram-rust-sdk/src/invitations.rs | 74 - deepgram-rust-sdk/src/invitations/response.rs | 15 - deepgram-rust-sdk/src/keys.rs | 205 -- deepgram-rust-sdk/src/keys/options.rs | 259 --- deepgram-rust-sdk/src/keys/response.rs | 111 -- deepgram-rust-sdk/src/lib.rs | 136 -- deepgram-rust-sdk/src/members.rs | 122 -- deepgram-rust-sdk/src/members/response.rs | 42 - deepgram-rust-sdk/src/projects.rs | 198 -- deepgram-rust-sdk/src/projects/options.rs | 102 - deepgram-rust-sdk/src/projects/response.rs | 36 - deepgram-rust-sdk/src/response.rs | 15 - deepgram-rust-sdk/src/scopes.rs | 140 -- deepgram-rust-sdk/src/scopes/response.rs | 17 - deepgram-rust-sdk/src/transcription.rs | 34 - deepgram-rust-sdk/src/transcription/live.rs | 305 --- .../src/transcription/prerecorded.rs | 270 --- .../transcription/prerecorded/audio_source.rs | 79 - .../src/transcription/prerecorded/options.rs | 1766 ----------------- .../src/transcription/prerecorded/response.rs | 237 --- deepgram-rust-sdk/src/usage.rs | 242 --- .../src/usage/get_fields_options.rs | 102 - .../src/usage/get_usage_options.rs | 599 ------ .../src/usage/list_requests_options.rs | 169 -- deepgram-rust-sdk/src/usage/response.rs | 282 --- src/main.rs | 301 +-- 56 files changed, 14 insertions(+), 6935 deletions(-) delete mode 100644 deepgram-rust-sdk/.github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 deepgram-rust-sdk/.github/ISSUE_TEMPLATE/config.yml delete mode 100644 deepgram-rust-sdk/.github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 deepgram-rust-sdk/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 deepgram-rust-sdk/.github/workflows/ci.yaml delete mode 100644 deepgram-rust-sdk/.gitignore delete mode 100644 deepgram-rust-sdk/CHANGELOG.md delete mode 100644 deepgram-rust-sdk/CODE_OF_CONDUCT.md delete mode 100644 deepgram-rust-sdk/CONTRIBUTING.md delete mode 100644 deepgram-rust-sdk/Cargo.toml delete mode 100644 deepgram-rust-sdk/LICENSE delete mode 100644 deepgram-rust-sdk/README.md delete mode 100644 deepgram-rust-sdk/examples/billing.rs delete mode 100644 deepgram-rust-sdk/examples/callback.rs delete mode 100644 deepgram-rust-sdk/examples/invitations.rs delete mode 100644 deepgram-rust-sdk/examples/keys.rs delete mode 100644 deepgram-rust-sdk/examples/make_prerecorded_request_builder.rs delete mode 100644 deepgram-rust-sdk/examples/members.rs delete mode 100644 deepgram-rust-sdk/examples/microphone_stream.rs delete mode 100644 deepgram-rust-sdk/examples/prerecorded_from_file/Bueller-Life-moves-pretty-fast.mp3 delete mode 100644 deepgram-rust-sdk/examples/prerecorded_from_file/main.rs delete mode 100644 deepgram-rust-sdk/examples/prerecorded_from_url.rs delete mode 100644 deepgram-rust-sdk/examples/projects.rs delete mode 100644 deepgram-rust-sdk/examples/scopes.rs delete mode 100644 deepgram-rust-sdk/examples/simple_stream.rs delete mode 100644 deepgram-rust-sdk/examples/usage.rs delete mode 100644 deepgram-rust-sdk/rustfmt.toml delete mode 100644 deepgram-rust-sdk/src/billing.rs delete mode 100644 deepgram-rust-sdk/src/billing/response.rs delete mode 100644 deepgram-rust-sdk/src/invitations.rs delete mode 100644 deepgram-rust-sdk/src/invitations/response.rs delete mode 100644 deepgram-rust-sdk/src/keys.rs delete mode 100644 deepgram-rust-sdk/src/keys/options.rs delete mode 100644 deepgram-rust-sdk/src/keys/response.rs delete mode 100644 deepgram-rust-sdk/src/lib.rs delete mode 100644 deepgram-rust-sdk/src/members.rs delete mode 100644 deepgram-rust-sdk/src/members/response.rs delete mode 100644 deepgram-rust-sdk/src/projects.rs delete mode 100644 deepgram-rust-sdk/src/projects/options.rs delete mode 100644 deepgram-rust-sdk/src/projects/response.rs delete mode 100644 deepgram-rust-sdk/src/response.rs delete mode 100644 deepgram-rust-sdk/src/scopes.rs delete mode 100644 deepgram-rust-sdk/src/scopes/response.rs delete mode 100644 deepgram-rust-sdk/src/transcription.rs delete mode 100644 deepgram-rust-sdk/src/transcription/live.rs delete mode 100644 deepgram-rust-sdk/src/transcription/prerecorded.rs delete mode 100644 deepgram-rust-sdk/src/transcription/prerecorded/audio_source.rs delete mode 100644 deepgram-rust-sdk/src/transcription/prerecorded/options.rs delete mode 100644 deepgram-rust-sdk/src/transcription/prerecorded/response.rs delete mode 100644 deepgram-rust-sdk/src/usage.rs delete mode 100644 deepgram-rust-sdk/src/usage/get_fields_options.rs delete mode 100644 deepgram-rust-sdk/src/usage/get_usage_options.rs delete mode 100644 deepgram-rust-sdk/src/usage/list_requests_options.rs delete mode 100644 deepgram-rust-sdk/src/usage/response.rs diff --git a/Cargo.toml b/Cargo.toml index 3edd898..0ebcf98 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,6 @@ byteorder = "1" bytes = "1" cpal = "0.15" crossbeam = "0.8" -deepgram = {path = "deepgram-rust-sdk"} eframe = {version = "0.27", default-features = false, features = ["default_fonts", "glow", "persistence"]} egui = "0.27" egui_extras = {version = "0.27", features = ["image"]} diff --git a/deepgram-rust-sdk/.github/ISSUE_TEMPLATE/bug_report.md b/deepgram-rust-sdk/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index a68b46a..0000000 --- a/deepgram-rust-sdk/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -name: Bug report -about: Something is occurring that I think is wrong -title: '' -labels: "bug" -assignees: '' - ---- - -## What is the current behavior? - - - -## Steps to reproduce - - - -## Expected behavior - - - -## Please tell us about your environment - -- **`deepgram` Package Version:** -- **Operating System/Version:** -- **Rust Version:** - -## Other information - - diff --git a/deepgram-rust-sdk/.github/ISSUE_TEMPLATE/config.yml b/deepgram-rust-sdk/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 422e244..0000000 --- a/deepgram-rust-sdk/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,4 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: DeepgramAI on Twitter - url: https://twitter.com/DeepgramAI diff --git a/deepgram-rust-sdk/.github/ISSUE_TEMPLATE/feature_request.md b/deepgram-rust-sdk/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index f99ae59..0000000 --- a/deepgram-rust-sdk/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -name: Feature Request -about: I think X would be a cool addition or change. -title: '' -labels: "enhancement" -assignees: '' - ---- - -## Proposed changes - - - -## Context - - - -## Possible Implementation - - - -## Other information - - diff --git a/deepgram-rust-sdk/.github/PULL_REQUEST_TEMPLATE.md b/deepgram-rust-sdk/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index d4b6aed..0000000 --- a/deepgram-rust-sdk/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,37 +0,0 @@ - - -## Proposed changes - - - -## Types of changes - - - - -- [ ] Bugfix (non-breaking change which fixes an issue) -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) -- [ ] Documentation update or tests (if none of the other choices apply) - -## Checklist - - - - -- [ ] I have read the [CONTRIBUTING.md](../CONTRIBUTING.md) doc -- [ ] I have added tests and/or examples that prove my fix is effective or that my feature works -- [ ] I have added necessary documentation (if appropriate) - -## Further comments - - diff --git a/deepgram-rust-sdk/.github/workflows/ci.yaml b/deepgram-rust-sdk/.github/workflows/ci.yaml deleted file mode 100644 index 42dab37..0000000 --- a/deepgram-rust-sdk/.github/workflows/ci.yaml +++ /dev/null @@ -1,93 +0,0 @@ -on: [push, pull_request] - -name: CI -env: - CARGO_TERM_COLOR: always - RUSTFLAGS: -D warnings - RUSTDOCFLAGS: -D warnings - -jobs: - Build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install libasound2-dev - run: | - sudo apt-get update - sudo apt-get install libasound2-dev - - name: Cargo Build - run: cargo build --all-targets --all-features - Clippy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install libasound2-dev - run: | - sudo apt-get update - sudo apt-get install libasound2-dev - - name: Cargo Clippy - run: cargo clippy --all-targets --all-features - Test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install libasound2-dev - run: | - sudo apt-get update - sudo apt-get install libasound2-dev - - name: Cargo Test - run: cargo test --all --all-features - Format: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Cargo Fmt - run: cargo fmt --check --all - Documentation: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Cargo Doc - run: cargo doc --workspace --all-features - Audit: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install cargo-audit - run: cargo install --locked cargo-audit - - name: Remove Dev Dependencies - run: | - cargo install --locked cargo-hack - cargo hack --remove-dev-deps - cargo generate-lockfile - - name: Cargo Audit - run: cargo audit - Minimal-Versions: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install libasound2-dev - run: | - sudo apt-get update - sudo apt-get install libasound2-dev - - name: Install Rust Nightly - run: rustup toolchain install nightly - - name: Cargo Build - run: rustup run nightly cargo build --all-targets --all-features -Z minimal-versions - - name: Cargo Test - run: rustup run nightly cargo test --all --all-features -Z minimal-versions - - name: Remove Dev Dependencies - run: | - cargo install --locked cargo-hack - cargo hack --remove-dev-deps - rustup run nightly cargo generate-lockfile -Z minimal-versions - - name: Cargo Build Without Dev Dependencies - run: rustup run nightly cargo build --all-features -Z minimal-versions - SemVer: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install cargo-semver-checks - run: cargo install --locked cargo-semver-checks - - name: Cargo SemVer Checks - run: cargo semver-checks check-release --verbose diff --git a/deepgram-rust-sdk/.gitignore b/deepgram-rust-sdk/.gitignore deleted file mode 100644 index 4fffb2f..0000000 --- a/deepgram-rust-sdk/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -/Cargo.lock diff --git a/deepgram-rust-sdk/CHANGELOG.md b/deepgram-rust-sdk/CHANGELOG.md deleted file mode 100644 index 6b686bc..0000000 --- a/deepgram-rust-sdk/CHANGELOG.md +++ /dev/null @@ -1,32 +0,0 @@ -# Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [Unreleased] - -## [0.4.0] - 2023-11-01 - -### Added -- `detect_language` option. - -### Changed -- Remove generic from `Deepgram` struct. -- Upgrade dependencies: `tungstenite`, `tokio-tungstenite`, `reqwest`. - -## [0.3.0] - -### Added -- Derive `Serialize` for all response types. - -### Fixed -- Use the users builder options when building a streaming URL. -- Make sure that `Future` returned from `StreamRequestBuilder::start()` is `Send`. - -### Changed -- Use Rustls instead of OpenSSL. - -[Unreleased]: https://github.com/deepgram-devs/deepgram-rust-sdk/compare/0.4.0...HEAD -[0.4.0]: https://github.com/deepgram-devs/deepgram-rust-sdk/compare/0.3.0...0.4.0 -[0.3.0]: https://github.com/deepgram-devs/deepgram-rust-sdk/compare/0.2.1...0.3.0 diff --git a/deepgram-rust-sdk/CODE_OF_CONDUCT.md b/deepgram-rust-sdk/CODE_OF_CONDUCT.md deleted file mode 100644 index 72005d0..0000000 --- a/deepgram-rust-sdk/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,3 +0,0 @@ -# Community Code of Conduct - -The Deepgram Community Code of Conduct can be found at \ No newline at end of file diff --git a/deepgram-rust-sdk/CONTRIBUTING.md b/deepgram-rust-sdk/CONTRIBUTING.md deleted file mode 100644 index f804f09..0000000 --- a/deepgram-rust-sdk/CONTRIBUTING.md +++ /dev/null @@ -1,49 +0,0 @@ -**NOTICE**: *For the majority of situations, please use the dev branch as the base for your pull request. -We only update the main branch when we release a new version of the package. -[More info](https://github.com/deepgram-devs/deepgram-rust-sdk/wiki/Branches).* - -# Contributing Guidelines - -Want to contribute to this project? We ❤️ it! - -Here are a few types of contributions that we would be interested in hearing about. - -* Bug fixes - * If you find a bug, please first report it using GitHub Issues. - * Issues that have already been identified as a bug will be labeled `bug`. - * If you'd like to submit a fix for a bug, send a Pull Request from your own fork and mention the Issue number. - * Include a test that isolates the bug and verifies that it was fixed. -* New Features - * If you'd like to accomplish something in the extension that it doesn't already do, describe the problem in a new GitHub Issue. - * Issues that have been identified as a feature request will be labeled `enhancement`. - * If you'd like to implement the new feature, please wait for feedback from the project maintainers before spending - too much time writing the code. In some cases, `enhancement`s may not align well with the project objectives at - the time. -* Tests, Documentation, Miscellaneous - * If you think the test coverage could be improved, the documentation could be clearer, you've got an alternative - implementation of something that may have more advantages, or any other change we would still be glad hear about - it. - * If it's a trivial change, go ahead and send a Pull Request with the changes you have in mind. - * If not, open a GitHub Issue to discuss the idea first. - -We also welcome anyone to work on any existing issues with the `good first issue` tag. - -## Requirements - -For a contribution to be accepted: - -* The test suite must be complete and pass -* Code must follow existing styling conventions -* Commit messages must be descriptive. Related issues should be mentioned by number. - -If the contribution doesn't meet these criteria, a maintainer will discuss it with you. You can still -continue to add more commits to the branch you have sent the Pull Request from. - -## How To - -1. Fork this repository on GitHub. -2. Clone/fetch your fork to your local development machine. -3. Create a new branch and check it out. -4. Make your changes and commit them. (Did the tests pass? No linting errors?) -5. Push your new branch to your fork. -6. Open a Pull Request from your new branch to the [`deepgram-devs/deepgram-rust-sdk`](https://github.com/deepgram-devs/deepgram-rust-sdk)'s `dev` branch. diff --git a/deepgram-rust-sdk/Cargo.toml b/deepgram-rust-sdk/Cargo.toml deleted file mode 100644 index 4d36654..0000000 --- a/deepgram-rust-sdk/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "deepgram" -version = "0.4.0" -authors = ["Deepgram "] -edition = "2021" -description = "Official Rust SDK for Deepgram's automated speech recognition APIs." -license = "MIT" -repository = "https://github.com/deepgram-devs/deepgram-rust-sdk" -keywords = ["deepgram", "asr", "transcription", "ai", "speech-to-text"] -categories = ["api-bindings", "multimedia::audio"] - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -# TODO Investigate which of these dependencies can go behind features. -bytes = "1" -futures = "0.3" -http = "1" -pin-project = "1" -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls", "stream"] } -serde = { version = "1", features = ["derive"] } -serde_json = "1" -thiserror = "1" -tokio = { version = "1", features = ["full"] } -tokio-tungstenite = { version = "0.21", features = ["rustls-tls-webpki-roots"] } -tokio-util = { version = "0.7.1", features = ["codec", "io"] } -tungstenite = "0.21" -url = "2" -uuid = { version = "1", features = ["serde"] } -# Dependencies below are specified only to satisfy minimal-versions. -proc-macro2 = "1.0.60" - -[dev-dependencies] -pkg-config = "0.3.27" -cpal = "0.14" -crossbeam = "0.8" diff --git a/deepgram-rust-sdk/LICENSE b/deepgram-rust-sdk/LICENSE deleted file mode 100644 index 6aa6f9d..0000000 --- a/deepgram-rust-sdk/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Deepgram - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/deepgram-rust-sdk/README.md b/deepgram-rust-sdk/README.md deleted file mode 100644 index beb5f4b..0000000 --- a/deepgram-rust-sdk/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Deepgram Rust SDK - -[![CI](https://github.com/deepgram-devs/deepgram-rust-sdk/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/deepgram-devs/deepgram-rust-sdk/actions/workflows/ci.yaml) -[![crates.io](https://img.shields.io/crates/v/deepgram)](https://crates.io/crates/deepgram) -[![downloads](https://img.shields.io/crates/d/deepgram)](https://crates.io/crates/deepgram) -[![docs](https://img.shields.io/docsrs/deepgram)](https://docs.rs/deepgram) -[![license](https://img.shields.io/crates/l/deepgram)](./LICENSE) - -Experimental Rust SDK for [Deepgram](https://www.deepgram.com/). Power your apps with world-class speech and Language AI models. - -> This SDK only supports hosted usage of api.deepgram.com. - -## Getting an API Key - -🔑 To access the Deepgram API you will need a [free Deepgram API Key](https://console.deepgram.com/signup?jump=keys). -## Documentation - -You can learn more about the Deepgram API at [developers.deepgram.com](https://developers.deepgram.com/docs). - -## Current Status - -This SDK is still very much work-in-progress. The interface is subject to rapid change. -## Install - -From within your Cargo project directory, run the following command: - -```sh -cargo add deepgram -``` - -You will also probably need to install [`tokio`](https://crates.io/crates/tokio): - -```sh -cargo add tokio --features full -``` - -## Documentation and Examples - -Documentation and examples can be found on our [Docs.rs page](https://docs.rs/deepgram/latest/deepgram/). - -## Development and Contributing - -Interested in contributing? We ❤️ pull requests! - -To make sure our community is safe for all, be sure to review and agree to our -[Code of Conduct](./CODE_OF_CONDUCT.md). Then see the -[Contributing Guidelines](./CONTRIBUTING.md) for more information. - -## Getting Help - -We love to hear from you so if you have questions, comments or find a bug in the -project, let us know! You can either: - -- [Open an issue in this repository](https://github.com/deepgram-devs/deepgram-rust-sdk/issues/new) -- [Join the Deepgram Github Discussions Community](https://github.com/orgs/deepgram/discussions) -- [Join the Deepgram Discord Community](https://discord.gg/xWRaCDBtW4) - -[license]: LICENSE.txt \ No newline at end of file diff --git a/deepgram-rust-sdk/examples/billing.rs b/deepgram-rust-sdk/examples/billing.rs deleted file mode 100644 index 73cc0c8..0000000 --- a/deepgram-rust-sdk/examples/billing.rs +++ /dev/null @@ -1,27 +0,0 @@ -use deepgram::{Deepgram, DeepgramError}; -use std::env; - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let deepgram_api_key = - env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - - let project_id = - env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - - let balance_id = - env::var("DEEPGRAM_BALANCE_ID").expect("DEEPGRAM_BALANCE_ID environmental variable"); - - let dg_client = Deepgram::new(&deepgram_api_key); - - let all_balances = dg_client.billing().list_balance(&project_id).await?; - println!("{:#?}", all_balances); - - let specific_balance = dg_client - .billing() - .get_balance(&project_id, &balance_id) - .await?; - println!("{:#?}", specific_balance); - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/callback.rs b/deepgram-rust-sdk/examples/callback.rs deleted file mode 100644 index 5533c31..0000000 --- a/deepgram-rust-sdk/examples/callback.rs +++ /dev/null @@ -1,38 +0,0 @@ -use std::env; - -use deepgram::{ - transcription::prerecorded::{ - audio_source::AudioSource, - options::{Language, Options}, - }, - Deepgram, DeepgramError, -}; - -static AUDIO_URL: &str = "https://static.deepgram.com/examples/Bueller-Life-moves-pretty-fast.wav"; - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let deepgram_api_key = - env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - - let dg_client = Deepgram::new(&deepgram_api_key); - - let source = AudioSource::from_url(AUDIO_URL); - - let options = Options::builder() - .punctuate(true) - .language(Language::en_US) - .build(); - - let callback_url = - env::var("DEEPGRAM_CALLBACK_URL").expect("DEEPGRAM_CALLBACK_URL environmental variable"); - - let response = dg_client - .transcription() - .prerecorded_callback(source, &options, &callback_url) - .await?; - - println!("{}", response.request_id); - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/invitations.rs b/deepgram-rust-sdk/examples/invitations.rs deleted file mode 100644 index 8bbf088..0000000 --- a/deepgram-rust-sdk/examples/invitations.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::env; - -use deepgram::{Deepgram, DeepgramError}; - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let deepgram_api_key = - env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - - let project_id = - env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - - let dg_client = Deepgram::new(&deepgram_api_key); - - let message = dg_client.invitations().leave_project(&project_id).await?; - println!("{:#?}", message); - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/keys.rs b/deepgram-rust-sdk/examples/keys.rs deleted file mode 100644 index 463a44f..0000000 --- a/deepgram-rust-sdk/examples/keys.rs +++ /dev/null @@ -1,31 +0,0 @@ -use std::env; - -use deepgram::{keys::options::Options, Deepgram, DeepgramError}; - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let deepgram_api_key = - env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - - let project_id = - env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - - let key_id = env::var("DEEPGRAM_KEY_ID").expect("DEEPGRAM_KEY_ID environmental variable"); - - let dg_client = Deepgram::new(&deepgram_api_key); - - let keys = dg_client.keys().list(&project_id).await?; - println!("{:#?}", keys); - - let key = dg_client.keys().get(&project_id, &key_id).await?; - println!("{:#?}", key); - - let options = Options::builder("New Key", ["member"]).build(); - let new_key = dg_client.keys().create(&project_id, &options).await?; - println!("{:#?}", new_key); - - let message = dg_client.keys().delete(&project_id, &key_id).await?; - println!("{}", message.message); - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/make_prerecorded_request_builder.rs b/deepgram-rust-sdk/examples/make_prerecorded_request_builder.rs deleted file mode 100644 index 53ceb26..0000000 --- a/deepgram-rust-sdk/examples/make_prerecorded_request_builder.rs +++ /dev/null @@ -1,45 +0,0 @@ -use std::env; - -use deepgram::{ - transcription::prerecorded::{ - audio_source::AudioSource, - options::{Language, Options}, - response::Response, - }, - Deepgram, -}; - -static AUDIO_URL: &str = "https://static.deepgram.com/examples/Bueller-Life-moves-pretty-fast.wav"; - -#[tokio::main] -async fn main() -> reqwest::Result<()> { - let deepgram_api_key = - env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - - let dg_client = Deepgram::new(&deepgram_api_key); - - let source = AudioSource::from_url(AUDIO_URL); - - let options = Options::builder() - .punctuate(true) - .language(Language::en_US) - .build(); - - let request_builder = dg_client - .transcription() - .make_prerecorded_request_builder(source, &options); - - // Customize the RequestBuilder here - let customized_request_builder = request_builder - .query(&[("custom_query_key", "custom_query_value")]) - .header("custom_header_key", "custom_header_value"); - - // It is necessary to annotate the type of response here - // That way it knows what type to deserialize the JSON into - let response: Response = customized_request_builder.send().await?.json().await?; - - let transcript = &response.results.channels[0].alternatives[0].transcript; - println!("{}", transcript); - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/members.rs b/deepgram-rust-sdk/examples/members.rs deleted file mode 100644 index 27de3fd..0000000 --- a/deepgram-rust-sdk/examples/members.rs +++ /dev/null @@ -1,28 +0,0 @@ -use std::env; - -use deepgram::{Deepgram, DeepgramError}; - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let deepgram_api_key = - env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - - let project_id = - env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - - let member_id = - env::var("DEEPGRAM_MEMBER_ID").expect("DEEPGRAM_MEMBER_ID environmental variable"); - - let dg_client = Deepgram::new(&deepgram_api_key); - - let members = dg_client.members().list_members(&project_id).await?; - println!("{:#?}", members); - - let message = dg_client - .members() - .remove_member(&project_id, &member_id) - .await?; - println!("{}", message.message); - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/microphone_stream.rs b/deepgram-rust-sdk/examples/microphone_stream.rs deleted file mode 100644 index 9165226..0000000 --- a/deepgram-rust-sdk/examples/microphone_stream.rs +++ /dev/null @@ -1,112 +0,0 @@ -use std::env; -use std::thread; - -use bytes::{BufMut, Bytes, BytesMut}; -use cpal::traits::{DeviceTrait, HostTrait, StreamTrait}; -use cpal::Sample; -use crossbeam::channel::RecvError; -use futures::channel::mpsc::{self, Receiver as FuturesReceiver}; -use futures::stream::StreamExt; -use futures::SinkExt; - -use deepgram::{Deepgram, DeepgramError}; - -fn microphone_as_stream() -> FuturesReceiver> { - let (sync_tx, sync_rx) = crossbeam::channel::unbounded(); - let (mut async_tx, async_rx) = mpsc::channel(1); - - thread::spawn(move || { - let host = cpal::default_host(); - let device = host.default_input_device().unwrap(); - - // let config = device.supported_input_configs().unwrap(); - // for config in config { - // dbg!(&config); - // } - - let config = device.default_input_config().unwrap(); - - // dbg!(&config); - - let stream = match config.sample_format() { - cpal::SampleFormat::F32 => device - .build_input_stream( - &config.into(), - move |data: &[f32], _: &_| { - let mut bytes = BytesMut::with_capacity(data.len() * 2); - for sample in data { - bytes.put_i16_le(sample.to_i16()); - } - sync_tx.send(bytes.freeze()).unwrap(); - }, - |_| panic!(), - ) - .unwrap(), - cpal::SampleFormat::I16 => device - .build_input_stream( - &config.into(), - move |data: &[i16], _: &_| { - let mut bytes = BytesMut::with_capacity(data.len() * 2); - for sample in data { - bytes.put_i16_le(*sample); - } - sync_tx.send(bytes.freeze()).unwrap(); - }, - |_| panic!(), - ) - .unwrap(), - cpal::SampleFormat::U16 => device - .build_input_stream( - &config.into(), - move |data: &[u16], _: &_| { - let mut bytes = BytesMut::with_capacity(data.len() * 2); - for sample in data { - bytes.put_i16_le(sample.to_i16()); - } - sync_tx.send(bytes.freeze()).unwrap(); - }, - |_| panic!(), - ) - .unwrap(), - }; - - stream.play().unwrap(); - - loop { - thread::park(); - } - }); - - tokio::spawn(async move { - loop { - let data = sync_rx.recv(); - async_tx.send(data).await.unwrap(); - } - }); - - async_rx -} - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let dg = Deepgram::new(env::var("DEEPGRAM_API_KEY").unwrap()); - - let mut results = dg - .transcription() - .stream_request() - .stream(microphone_as_stream()) - // TODO Enum. - .encoding("linear16".to_string()) - // TODO Specific to my machine, not general enough example. - .sample_rate(44100) - // TODO Specific to my machine, not general enough example. - .channels(2) - .start() - .await?; - - while let Some(result) = results.next().await { - println!("got: {:?}", result); - } - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/prerecorded_from_file/Bueller-Life-moves-pretty-fast.mp3 b/deepgram-rust-sdk/examples/prerecorded_from_file/Bueller-Life-moves-pretty-fast.mp3 deleted file mode 100644 index 0de454c5541723ce71740731910ec72617c0fa62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281957 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 |Ec20d36q|rx52-}A;;CmNB8#yCQ{0tr zLU|M*e}oE?&H;Go=0Rsqko6cm5Pd@Xhz60Wb~X7;aU*x)6yxb;R#AgnOMb$j`m8KU z>Uv#DjL6O*?=X9v14GNrzfe{)a z+juMesP9h}0z#-0qFK_j?bUv$t*VpCq#^R?(1Wbki0;#WuQT~5S|giZwVqT}5=RcB zpib9f#2LXySAGKPr1t9obN`b-_s<}aS#-}z(` z4x?mO^xWwO63}DfX>d;4v`03FpCaCri~`j-&C zYP*K2gcDMM5r88TyuQwh0yVP<3<0it;oJv78D6ytR?+EC+HzMh&EG{IxE;LVkZBU~ zE=)R_TvtGq0R@?iNY*`#(Sl1khyXF+^~mznCTxZ=wap!cWG)mxe=+GZOY=)8+M8(E zri@-`(_V`(weG@V8ums4pyt{u+zrocx zE;_aTi$I<`4wfoIRXUJR8aXO}*j^S@9#X&>{%vVTEZA0csnF58icUIBChO;?lQoU# zvE;dYzCTK*9pUrVeJR#D&#Rd!*hm5gZPy>K5y+OsZ{HFcY$S>+Tfs0QCziFt<=_YCW?VKZt@BcE}NYi0-MKcp0%Yaa>r zV$JtBTSW_(72{SBGt*iyy3oTZgPoKjUy@ibi8vz~I*KO$wq+BBp}_uERJglH5kqW9 z6bV!ov+$!~c^9J;9F|Ili5mVEE0>im>vO4+87*UW0hV6vuu(1#H8ml%EFNtVk?WLBvBxMqLW_7Ul8Gn#fhV2ko(gGi7Br_;CG=?BxNPlohRy5Mky^+# zg3{xgv?+s*-u$(7n+GRy*F5l-&^EzUpRg)P4$1kygh-G!TRCb^27jg>H(+-IZBaD2w*o1s7ni= zoZ-#b6h?`}syT;;-jC`m3y?_oGb(8|?5Q%VMFS`jQ&bBBbX`Az*x!(+tA8bWWacW> z3n-A&G>xxi9AFugRD#;>+R``JdKV}0dG^}scPM=w!KAZuR8UsxXJKFn^HURW)`Ew3@4~?ZrGpc+0W7V7hnQ zagxE!mqw}b?jr}rHo~E(`$HVeuf7FvHXK$_@2py{y>>)9Af+Q+PspBzmPmnp^^>X8 zWo7-`l3A-({t`k&UgfB090y4M{Ev{5g^=5B6SggY5>Av5P$JLX!PjUQk%YJxD}A-Q zyDp#qp{PkXg8YhCXiSMnFN1pMtV_GG9sv->hX`8?m};H%;^ z+>;>w)9--=+RmEL=2T;^ob_X25!gGu+yQRFX;vXms!FF%>T3~SB$!reNRexR#Aqx? zJqwkzrLR3J)OlTg2CJag6RL@mlM&)pN_53TF~0$A03az2X}3?>qkzPM0^)AKZ#VW4uk7~gU~gn^AoXl9 zYq=UBE8RIE9<+p~tM}Ra)jzd@d_JwKCZ{uc1>g;6LpBcsZt4oQHGjhm+TB#5Xf%6W zDprO^q(iGSeAc>_8RHnH7iNfrGDTu=>kX6n6zfejdwcOj@CFGI{D39lFGR4Nfn#wc z_Z>K#>0_wx*iOM9H2iFU@oq_KKR4KKz!}%LNjtVFc_rbx-1+nw*B4XZZX*=GY!C7F zkNfLq?_-#SoQh5osU&dLZZ+P`igN3eK4j%`xoT(_h;o4a$#G6c<%6BQk}d9E)*d-E z=bo2m3pgu$O81=Vb{!3}80QDR5L#u`@3ka=0z_>F=gOjpP~)H%u+CGR7P|O=}CpF zaVGx~`b_|gR#VHhr%sV9&VmAY%n3*7gxs;1_53U)w&;-H?x)MB9-s>2DJg4&a`>-PJLp&QUP_NltvX7M`-VEg_aQP=`3H>0^hAh$lNh|V|N z+xD+6Hrjp#$N#DX$c8^98h#kvq}HQyLndSwg-&UwAvESfJkneAqosg2Y9-zR+wlcx z1YU*OGSELxC)ONhTNy&W6-M>MsOCg-eqI~$oVl`x1wYj(KA^l8v3*S!8dxMo9>6m) zb4>A<&@CK2NOvSGTg4mpVM!4KvyWi&ozaFbNX5ZhTg_5+`HWUlf}{pV#0 zBc1(h4xrSg0kAQ$ZQFRWI=hy|B|D6lF)&rD48I7PXp=SZgLztQ&^JavCH>eiSM}Dy zT=$E=%XZYZqgcL%*t;ip!?27QoYFVrSDWdqa&1Pv&KQLE4@Y&zN(7F^9)4!8g583H zA6K~-uYwauQeM!@B=Fh!u1in1rn+*}+*@Fawl@?dG1+sYX8E*Uw1Y+I@xuZqA zP4o*|pIvMH#Y}((0uY7au=5!yqcq+S-MK3n;Mdp==#Soxr3&O_O;YL|dw|NF21cy0 z6Z^jZC3G5jeP%Npr=d>IeXyhn1QC#k@X%Lxag7wR()D0bD}Eg0TiTa;%MAJc^?}`p z7yN*XjQ4)Q>Or46F#7Qw`2tx0X6VN?s{r2Lowjq7J=QNHCQJrG2=$vKUP%VleH(d{ zk#jmBrU+DBvhDn4o38aWZe`#n^29?VRTEo!@}z5XDfOZac}l_eaQhg{}cj8N@>{;*HZow?-_mE!biDaRmn0W$lsH zq)oN484GhP`eWvsVFGZ_T(N>BF_8-RPvxDBESXZXYW7n#Z~%MA!nee0cuJdh*-evG zzKmj|8!snX;j;USVr!+9>ChaNNJr;>z}yPR;5{-Y8C{?$e+!;g&niDTd-2V6zdiCm zejVZ5D)gr1H7~R;jQTa~o8ofDI?$hQHE_MHJiDyP0%NHS@$B{+wGXIyYHD62{#MttFD5sJ$Gc>n&t+ylIBQ7NoXTiZy!N}G1Rp#}} zBV8DBRfcE-CA<&^I#W^!5#?{%!=+1y3PiR284sj|1*Dsy~4h#qKOmlsyI z>aYC`m+OXO5?HCId%#dx3d`+!ngLWX63^N{!Lb4XB*y?+00{uqq;gMr9m|hNf<))# z^<4l1UPDaAA)|RF=@xvQ%ro+^{Guf*K1YZSpTNb6X9J^SOGA`MIQ4YFcw8y_Lq)*$ zOLnn`)aTkCPPG@F+!IzuanK}uJKK^{3w+jj)tHmnW}#=dQJGSyGGBWTjm(V((SndW zWmFWzp2n*nj!Q1&ll91Pg4q5tj*C1*fg*3{d>kA)>|-aw3%)#@;vH-<(h>q(t6SF& zWqfo+FC1isP}|0p#RXc{h4RfNhCwxTsPTla(15u7mh%;I_!a(eNDm51uQQ+?n@fY^ z4fBjq4R87=@Uz=dr9RmfK{K+>ZI7p})O?63gspCj%GLI* zxH;c_PwJKSm>=Xw>~xS+;76?Db^c0=h<2?()pFDMuKSR{g$iludql#$XuQ#$`UA6` zNIqn8)-Js3ojlWZ8~1)^)qJrs#z&WO0ou-ieoeRyk03dbB*f;qlThJ~gf@RNFHX7P zUnlnxjxnq@G3jB695_C04>BHMk5sX{Bip7+O(iHug*JxGjg zQcz0Gn_s);dw8XXckT`I2bK?IXXA7=U#&ExI)AynajkWKIIGxb_v^Z?OiRt!OHIpu zDSo>euu~Hxc>DQR)0sHFTNa?aMPEme8TTtCC*AvaBC~8ZSdy?5ZyY=tnDmYcXpLeo ztd8@PS_GP;skj6}H*a~-$E>X0JtfT&mJVASETjkL{+8oi3{TIwpVM=aW6e-$KD+{lR&Nl3$ z{t_~a`lYNl7UuNqznU==y(a86R=gwsZdhZSY}UA66gDSOwA4JD0cAp_sIB6|U=gyI zsCI{b7D*pvE9742LFu9u!qHft^Kr&t35R-fTs*}9Ck$}orAq3IPO@hx8aElHUg1c= zuqEQyA;gM{<9*rVN=6ps5Tvw`M@HEvBp)HV+c}40+q<^lUQ-?5U3i>yu-UVeKKdqe z`^oFG-qv*?jdf+}QJV(JNSkK9Orp`u=uo-Q-svoM+^5ff#TAgmnoF;-TXuYvP0)#| z$g1wd+ASLV@sWo^8W#e=@XsFebKOM;8G`+E4CHeNxa8OTq*9SM zOgips2NJDn6Nc2xCU*44FnS{ki1qHI+io{L#Y9gIP=6hPGYtwN5%dL%qY zOM|zs$kS6cOZF@I27~%_7@j$un!Ixat~i*b|MgyPdR~qBt@NN+*)!*bU)QT<^YKc9 z0#5mDXjI73D6lL(rgS^ngF6c!qhkp_ViFz7kz`hM}5|(qA9md++}5_!e%YtI;MefXXpE)teCp&#E zKU`+N6;mrV-S>%@OrZtm7^K)J{v#BUK4j~{Y%wg3;f>f>B;qt-jm}%p>@!Yy&*;3< zyM)wtvRR3qt94loJmr$~iY=7mO75-}C5+94dzLwsBzlbNjXS~Pw<#-wL*LG-*bukM zL|-ynpNPsMeJ6nUcRI08^S)%fPQjE(v;`@yk}qoZ#~;G_5WIA$$9SEIcC}h!kI9Td zl<9n35#C3!)<_ot;Z>$2|z$U1)ZadZuJ5uvvI$A&_$ic}}JPK1#D{hzu^ zU?vHnsQQ(je{Ber)oRTUeUasf7SxU9Y|bOm_F|&k8%2CTgasEbHtZen ze0R4|gjM9J95Z1OzKw1=-R+ln4YW8W&YzdZh2QGUHO;8rdH!kfP3AH@Ew8x$LZzr} z#4Tue=#+jgSk3Hs!Gqh~{>wL-8HO&^4>XNwlTp@RHAdc9;Q}>$O9C|%*gFz1Vedtu zWts*HWT=ASCUs)(ayL^GJdaA;39ry=CC=Sd5){<&`t&tJpZ!f4Etdq9YheY~J8iSB z#DcEp##ALS%-4hzJvTT-jbf!9nTB636lt8>QaHDB_npH#?38XZ*gOp8N|qE4`A;%` zbYFMAsi6e`FDr|SI%mXzyV+oAa`uqcfdXED;WnL)Cp1Kxb)wUjqX=%wY?G2nUz$xU z0?LAa9o{WAz?j;x&L)1M%Q-h|JI2!6Dtejd-W}K}=A09?@}i5j%6L`9F~Ma0Yf3>r zf7gA%3YFhp*5aGG7u|Jjzy3$9MT+Tv35A4S0X3$rB5D5fas(rbQt=XuivJS&-!=D@ zLv2d{U>W6gv8Y0fhXu1;Bb~Phx(u)|BXd)WKFLmX&eK`bz`$t-O6Qcp3z3ncwB>Ts zT~T2R7P$RXqGjro%Jb{RaTt5VTd~#E&bpJ=BDU#u&n|Axo=fnbeHxl<>g@99ZX68< zphfo(=uG(J?OgyqkG*_fcGnKZKn0vgP@M#ZYlyNEk*9^AdKp~RjA6<|Or^}c2gfKx z$}F2IKlhq!8c#DELbLwiT4PO6lB8~ovWBk_iO@b8%Hpz>SVd*aogQmUUOG#jHQARs{A11dUhrf?QO?YoqzJX zT2U`KnZH^c@@@ZXL!eTA(Wv?_|JhLe)bFHknO`gCt>#n{m`<2xo%gY{2gh?GHurz{ zs|ULYHe}E0X)Cr!GjYXSVY@CbTEYg_r_a1inTOl-WIIhd1ZsS>{ihEDbo3iq+$4hk zoG4O|)x4vTp)FVaJpjPZ+ueGGKVy2Rfk7^{I7Ft6MZ&+20!xC+-ob{SzF>nxQE?{; zaap!Hyx1Bc6sns3gP^-0rh37o9y}1h%LqJ>qQ(iziXe%IBuY2;_4)GgH5EKozY}nR z0lxy!hq7r0>>oVCOtG}HA4_M9g=I_@NT@#Wkcd5D3g*pk(wvd_6+C!qu751MgRp3Q z?$1y;A;jiNotU2+qllmffPYi5>T-%(5^eVAOw;p*CkZUakrjY+-Nf=*X@}(xHd%Wt znP}7hc1 zaPjn&nf`6%ce}xWp>(1;{)JUp)8VND-wp8gY#KLXW=f?tm5q$pKL>c57+3R#6Jdn> z=l^-R5Enr%WcJX%Hk1^AHhese$!>K0c{QvFfQrpD?|}0b5RGR6gM9Z-+LXS4Hem$n z|13-eQuD=dljBdT$0jj^>2+)rbz89DJfpFjQQ*^HifqHK!;nyK2khb7&BlKn%aP6S z8<3g?4VH1FTXK124Ge_w-bQiLQEhBcv_AJjYx0WAnRT#Wgwp?JI(#0 z(C{7KO;YbMs5Aa`b}k3wGACX~Gsa{i=gV=2*DET#lgHcu7~CD!BTQbH2_69t*<6$5%H10!vgAr|)2Hj5QiX2qD z`u0`y9PI6DTBmC%wWo8=Po1|3S~a>-o!+_7Nv$6V{Pl8(=&Kh7lO(P(+W!&KOBPhy z93R!8$?qY3i(OkUGFK~;Jc}Lmc3k16j4{@&N{8(RwupW^(r_Gqth+Qf&tq=q{=RLV z_{T#hcTzsk_JEu+v5o78jiV0@Sg}i$;$z^K%6Hk~{z$n#@tpRLKi(h|5L4C=ZmCXt zu!Dw8{~nDGh)q6EpnNKH(+w&EtegeA>2eaUv*<}t78 zEac4UU$6}ie%35J*@_81zA`&8kyt_M+m--r^?-B0fQn#XFPw0A78t)z2|}k#1Ahad zxT&O0=)32KM=%{jy?=;0@+%z`ht7r?zBmj}HkTfK=j>)_@2rRS^Le2)K3QNtvYUje z>!gEJ;9es|r?H$v{AvK=LBOq8q)>j(#$zPmFQNPB%U_1mI<6d^vIoDR=tt9_A0~f= z)971TIsio#mTnqlWrU3b0|%n%)LVl!~KXn!r`ANdl>TgTheC(y(-@9{ibd7FO;n?Y(y2h>JXWWG^B$BCSE!_By0F2){VwlHJ@WC*D#w~Q|{>U-y zESnx!lC1!rl~f7iB|IvWi8(ChwysKX>1I@`@XhXwsf;?XwoIcKL(I;PvyVLh%Zjf) zwn#J&(~Lk4y(3r)U9_knF`|QE&x-wf**{_1*U>)9R#Q5vPb_6vek%fXdx+#%_}s-k zVgNK-NJ6lt{L}mrmuPS~t&{>2om^*;s93j>1vdVU#lidh%sx5wH-QT;dL3i^QFk%* zFdYmoyF|_&I}V;*HkWO5r=xs`G2))Q5e)0E;(!ctfLk3j&KSBU*twZY!i62JZ?p*vq3q~+ilF@H` zf9L`)HeEX%o@^*MAeHPQKnzTtkufVC)vkRrzSSjsE3%YPp9GayO`4WBWUi7($gp{Y zk)d}$ZPDtvY^+jIm=w2lWYtzZ1SLiwgP=S~fMrUmmSfjP69DU-$-(eUIeMAZTeB5^U znzf0$pFpMlUOFevV9DP?Oa=XlUMge#h2g&!5qCpK@$#M>uQ6kN(ZA7y8_j!!4)IIp z^nqC1Eh2*=8)bpve4gpUNJL=?MaskckdZ%+)r7GEHNlS&i@Y(0!D=kJuH@;4Y z&dyt)xbe#D5hlq}Pa+y-{EBN|C;@A{w(168g4C`GeIlN!B>GR!>KE~z`9^%Ot+cAO zXPfpRtxCGOgjYEJQ#c3lR;&u$f{*IeG|!8>%<;xa9qZ=CfrU384%R^wNd>O*s>N9r zgkf*XUkTUsO&t`rDSma#lH0gE81)%P9Gd^arxau3Bx9%8_9WkaErWP`cY_J=Zfr&K zWEo)Uf1HaVSwv+yolH(X@Gvp6a$L zi{K{?wx}z=wZR_!IN`YIfpTJ#&OLIgRC0BKgAd42 zHwnk}J|X7JM8jkF`Ib!aq6b#_n>DoX88NKvi5{-Xp;zge+T&-dFd6e49S-jEr|4_`m}v%j4!I|{DDjOECPy@OpN-6z5#S+8Tv zb{aDV_)G$syX7nQU{Hrx|ANp8zDFR7SFtPFfWk;X3Nk+G{OAk))H223O*B#&A0-(8 z>@^h?MA{flhD_HAWzw=B)(Y3zHpKQ-0Gysb{tY1BmMGaW8-xD50m zOpYAaX<9Wfj;d%eh-89*5(Twax*rQq4!DOptyR*`NWz+lXN7_G{&`)v0vr?8H%3iC z&rqSN2x#}a9*Eqk6n(}naFOYhFCKT`x;?x8^B|~nCBxPHoQO_I4xL+kYp*QsoWU4yxIDdj-uZ}ihE;a#KC;@Y zNr?&?1y~k9ef zjXP6k2+jdGYVu=(-t0l}%X!3E_ch`~{=FjzAIiu9%?3$;#sow}_-^(1u*~>iEW!Vp}ez4gKQ9R+%dF46mCR0PN#wx~`9n;6xCx=-XZ68A6`9fb9Iz3J) zO2^D#x^#CPbXskBHR7)<3{qVUbAa}Q~LE);)NnLb%GIxM`470K{;wk$rw ziHXp9O<8|tRLw+8j96)CZ&-MlHz6e1(bAK*7;Z-jJBBewA$#ONOJQ;eMsUR>Exuka zi0@le+N9_hKtZpv>38VzFJFvuA2vVA9SeK+A0ylYG)hLF;f0ykAGgfCDQ5f41*tzo z(NH=DA@(l(?biaIXa_bX`t7Omm9)7(Q;>XD`{VmO(+{nqN79D=AG0o-5USC^Kvs-zrz8QNUF6-;ip`WOaZS|DnUUuS*p_IOY+m=$2JL{Dkq+yTqh+_Z>g zzGBrw{Gtnr2%fu>>|QolKC_mb>8z^;0FZln6gzalfS62vtSXPQz^XvcW$}JDc4p-y z!7GS>xD8Z^)ig`M^4uwA#ww*~h7zQSA?UEro#ia;05G+-Vg?Y$xN6QyjU@IF!g{QF z_D0#!^c^(X<3iH_p9m;{(8B307jgFQl1YCz-oy(T7Yc$$|k}k@&yhEfa~WX zkB8D^&imKw8H^u{P{})|b~=Yo-7U1OE%21BeSWqF;r-N7VQLS`)c(Y}=W93f?Zc7g z)ZkW35E&aAlW4};l+oTt)Qm4KkTbDvAA(;S$C6X&Trabap9j_GSd^4z{`&ATI7{zN zdRF!J=7A7^1(L#|4MUW_ty{h8z6kzZNH2M}>U8#4z@D*P6bqw$f;{X7q@j_nqj33&nnxm|b3;do8-E;v@ z9p@f6i%$60ZJcwd4n2PPJzKZ>Q(9weMAE|Z7%ZuO>Nf>lZycubersGDlGamegy1zO4QIqiQO8F`{Er~I(%LCGs zM6u;|6Z>jM&Bg5+xEzvZC1Ex#{u{VwlU2J*Ddc(egO00G46;=A5L&a3o zszly6vko0JE|AuoJvS}s8)WfZ^x5|^jJMC=k9;X<*0!q1_v}g!4nW1#>7Y%z`pv=x zmG>-QD@VZt=X|%Bp@P^IZq9|SP%0%2_LL|k$-Sq4TFrNUnj#7=p4qlc^Ly$pA~492 zubI(An-FB+Jk(I}tbJvkCcwbmMgPn+%zSa(j6KWSyqvCSRwCW8YF3f?vT*Gvd!r)X z_)pWm@R_*JfxFH^npuU%&j-Xq!p2?h!l{qp4cB9EXS)ye+}-NDMoD&y+`Fx>y(*HI zEi^GJ(A#>TB{4l3YDq)5{a-?+;ny!zCc8aoku>mWHvuRVF}$4ITl|{;sy>E?9oFC3 z?SErgHrQK1%PoITBExv8Sn&Xycrv)EDAp5QID`=d6G~EwXiYe=B!HeK^d4y~A`l)P zu5=G1D{1?4KUH$?H9y2R6jYDFKIZV4cNOVVfgMQEWSQkYIUAQ7rx&rBQ>G^HgFrgH zqj$^;{bRPWx3r-InI*ICwoLV@+%qdG8RRm2tL3Yb4g;>!dS&sKd}jEc;2^yY=;v>9 z%0=sCou~$>tK$>d7yRo&I~8vwA^R!f4v6XI6i-$wA_IIF1Sj7b}lUx zH9E_Z5(Nl>XMlw$z_d;u=#upJrEDNI1f@}A@czMS8QWF9X_z?P2qkS&bqtSD${8lG z-ZQgrZ(T#@jd;s_=J3;l&_I!PztV=FdiI|S^qVvF2FZzyW%;!^CRJ8f+3vGRj2XRI zPEi7~?-PW$%qiEuD>QZItaIp>Q!SQ`965Z@nv$mRzbdmjW&Kilb#|2@NJa(Fvz&lH zD-#`~U}10{(2Ku>%n7b7lvPu+WzPRoeJ&D&-0DC5r)|F=CL+cc=J{HZ2vIK3wOsfD zOL7p<28n_cKlK7if9vUQLvSWd0$!c0cb&JVH?ByfBU^n*ea&gv>cAyZIbYzx)Aly8 zXEHWmFX=*Wc^S*a1^(`8ZI4?;Nyk*KosaIQC8K`7^Kz+THHz7Q-1KNnx`>_2Rxmkj z#LqT?ddw=(iv$SzeleBZj`-cd*A;uQ^B9)R`x^(2j4tHiA)*Zlh2NS^FooeI3Mkjt zK&&!L*vdcyR-gj5B@JZvxy&Zfnc_X#*8?hiAHTibO--P+GBNtZ9oMUy&hTc@$lFit zQv`F5uDievR@qT#`di?Q4m%#mZF3S2hrKYGH6Tak4BAaT87$Ic`6Qa2>OD zE(jOb-((Kf)oJC5-tw3J-F#^!SZ|2eyq~lmLTvk)b0mcCXNI0BxoXx+Y~9$fCT*Ch zZn4zp{z2Q}=a@QS=PN;eLS-7m)Yx0!hnJTA-#x2P>s<&@WfB+xQ&C?BvU3$-xSz0x(r@(kHkiswY_Mv}mXdv3v8FdkTR#JA9U)tM zZKj;e1iu-MfsuL3II)pzx7toGML$lL(iL&PvUkuDiJftBEoOPIJt-$wjE`4+I+>j5>{VKpd!v=|$d+seC2i&WP2BAw)G@P1=8ix=6(FpzEN23E{xgw)$*(x5o9+KhvqvF(E&%{PQmMaJz$c?~fVYOrUi8 zX<&undzL(rTb?z$_fT4yFs`a<6XVN(vbN72;+UA}IZ1OWAC8-aM`a3#pE6@IjQXE1 zl_hUmsyAR0rxaZcGFI%5#2=>RFpd8yuB}Uzi!NLym3pGxhuZC@;rFo30gUEj6|M>! z=hKdl9g$}R0Q8HrrAoZ>&_`yu75I9)QoTG?G#4>m)-=?2dU=Ju4l6ik;S;f!z-Wb$ z=l*%kz0QW+TW!$jdd@l>lR6lk^D%yh)~OudwZqjrg44g6Vmys&!{Q8aeRI+EM&?4M zu(ff#K&nF>@u!m3bIKQCap%Ih^mFvbGqcf`|0f4VS|hp0DTG3p%qIdz98cR9-Oz-f zJofjn+g$9y+c~uftpW>T*^4$z$_?l4b1r=6nriP#mf%*$nvuYN3SP7WE)kM5hbJ`1 zTaSbX4&yoM;p$V&LDgYVTCUZ(y2K)J&1n)aY8RhiR^WG$I5idGkxOI+8 zIB)Z~jK)sIozxGu@eh-03Fdc-gXf1RciQ;2+N`pw%V8xo8;A+?QbjrVNYGFr{F@^H z4e02e33lSwPSWx6PkYK%oJ`y)|6Eps?2B7My7#N+g7OQ$HEoouy?QsB_$%^EC&?;>3P^*D(%0;(0USzCG3^y(oJHgT;Z1Z ztbY5U{4-Uw;Ov33-~AW%g{LXwzZNmevgtwooobCMK6Ex7ZLaf!HebGZGOrDBSkK`T z0HQGBqQVr7uju|yfc$?B`}CFUka>-UqrzWG?85#1bHp4S#KAfR2F|l(XyBRtPV^m} z7d1?6wWiFa#VU>sE4h1FM>0?5$H5u9&0I`>ZD%4ll)2$!rPBR@B z1Y(u6m19&W>J#i@NC-Sx#=jil#8{xGADb-R*hLW8K3>UTvxAFhlexq^<`PyChnEJ3 zH$V6rqaQ&)V@c)2AZ_rdm(|0~HKPI_EJalx)_|pBn zbJ^#-PuNvT{pHw7UnD05eL#85AP{m9F|;!od@bj2+!nMZM*dYpM8#oTWf3;$@PC1j zo?d#F5dhg>b3r2_8Kxd*?Vp(&zSbg;#)c)fXZ;*lQPTwFZI=nyP>8uURhU@L$4iU7 zHSmknFJYey?D$J)9rY?yR&(pOP{DtMj6B3xHt+tkAuppvS;J?FA(*tNN6@cVzI>b7 z#+sfcVx|r}uPN{(L|SDpjE)}$Y=359LYQTT?H;DM*kExN_U z=u>8px%$F(u=S&*Fa1-_F_2XB_&`Iztn>c>`rktV{%?IEjf97K7;Y_%n{CK25P$2b z4WkEa5>-T=@mM9N|N0xyh_sQ?bI?^Cd<~T^C$gi#=&BQ+wO8Oi`-2 zFM^Mgf2czXWL3~Pj7!eGQ!-4S-15{}%}9oRyz6&o&8f(}zWiRX`-`6m!dv&~r|HdC z(b7a4a|uk8mP+Ur*_QS+6d_o%hA-rnJjrodpN~qzBO^)KIR*OS3SPZ~l(x(B#=LmS zT2SOkBNU7QYaDZB*ELa=NdG!mlpK8SI84qRj^7$?-#;9lB;IsN>LU6jKlmzIv>|FO z%;M=`_dd_rmRwz)Rli^Z*@3~M&evXlCFyeCV{{kW8ZNyRc!pL&W0?1tP3mJrz zhGC|JWO8ySs}9!AQ0c|zY{SS$OM&c$-T2Q#FV7UTBU5;^eya&rGC}wMX@WP2dR6*d zLq$W?^1o?lVp;kJqkr_jfC$HUhAMGMlfJ(}6HhDTeSV)`VdQkImL2yNK9-VrvOKRj6ayh@J|-XCfC!K>pLrc`DBCHIpjN@<^*xZ}Ee z;NR?N@R>?zllahzC}uHAkJtjt+U+1}q>!m^>!pJ4%!8!R7m~xwL)E1;`BpMBs52!- zUGMW*#R-UG?VgMNUm%2>*mVTixFH`wx}Q`ayJ_%#Ya+R%FMS~<#3D`T%qDt~*0R9$ zOG;H~&3A?&o)_V|xo&A@zWhS<5d3+?f1Dh_m9e;HrxG{we@^avkxy+a6={6`m=H8{ zLinkhAo-=B15y%n1zm5+E0M}`keXLQ3K?cAWx~@$YA?xrvtk$3SypbT2dV;p)?6F( zdV9S7LraZI9a?y?OT6%fsEzAqcuX7~m{}fGTOY(%g7a~dJ97`FydQ-EpS2am1*iJF z3#9c{ibCs}D3^s?#GpW#Iq7r(T(T5uXPVB69P6D14?F2ZldYi8q3pg>9FASj$;(4xdvOn9c)xI-m~F&a`onyh_6 z%Bz@5kN%5pFl60Y06XkoLMxn;xq*TIEfh$07e(E+68@WpP>bw`xXo3|Uwqpzq0n5+ zt4M~H{5UDCcpRO#_-dAHoRMGWS9?Y7tnzuNnOL;(PNT0TrUyR^NRRKp#~Yn=UzhxZ zaZo^K;e8AWv%LxA6WF)N&@-717!^rFi$gF$%PnnVLV?DgV#Az3M#d|JrsjwFG!zr4 zh0z#qXB%m24J78>-a#kktsi2|>_hjl4xoPph529rc)u4~G1bzeLeB>nf=Ta+F}Z0e zl0HDad!@XkD)t0F_LM{TeeJ_#u-MB+1IbZ2P)*0hf!qhQ9dnT@4>?J@@;mC0StL7d zCuQZEstOfMG=xW8Rf}~#kR1n?lmK0KojisR)~G|~v+-KHOi2#m(SjpQK%k@4!WS zX@Eg18;5j?XszibMj(}KS!T&<5=M+`1yx6i1A$dRb#ovlm;7uS0WFNCy(iav+M^VMHC#y8uQWfO$UHri65 zXHm1a3puTi!x))Ec#CMmr7?h33lsn__`#@_IHU^o-njG#H!{1tdBKJx?dp;|m9FAb z9JW(cW2YdK-)7W;dhQN?HlelJ8$wqKcgTlg`lTIZcG{V2e2k) zVyPZ0+EsBVmnuGss+SJ+y zDm$-w9jiK=3d|aA zTn2ahU0%KUffjYIe_-n$3?ocMu*>73;c;T2@lyVNY9-XD*^6IXO+3+B_LKk!d>{Uc z7z+~{+)Fl$UP24)4~a22r!dsZO8AI#(J+RAYMq=_$h1vdrpt$iVH<)T$Ar>LY{%EE zZL{ThShU5xS8m!oo?L6&ub$CUQRqJN=w2qxqDvR zb7ysbMw|`*?Tmo!^EoW6pFdP3vXv9nMX0Dr=ot!tF^8rlqC8QlfN4vYrE|s#H4HNk zgcrf>7=v1@ygO+)Rm44_6swp#BiAdeAlythWL(+BLus8hx)F)7`P!IiQ%@OnL^hRd zxKws;EVBe%7HkblU~2LhQm6LCUo#xDX;szl%NN7muqvWZ%(78eUJ49q)%zNJ@@wiq3kcC+WdmQZ}cL#yGw%y4^phO z4ek_ocXuna5Zo#56nFOmr8vc13lyh#i?>k7Lx1ak-;b0$S+g#ZoGU zxwxA~GeJs~<#=a4m0u4sDLKmm*q3628f`ASpOg^z0a%q*qVf@5}>_|Pd zZ^4o>#8~*44D?KoLU=7iUkWSRy{At4*FO4Heee8we0=UG#L))2{9BZnDR5|VBHWl~ zmwPv{=p~x-aB*{|?%p-`Y&PJuzKK4NO_rFRR-ES5`+=t=Ulohbno&A5**}DziunCY zP-r^Nr?64QUV1eQY!nTYEqWxhux`_n-h42@TMa>vcnwcW8X6jU@FxYZ(UrayFe1Sv zNc0NC-JpfcDX5q}Hr$p=G-eumF!g}46a<-%_m z%*J2%n*T3C6zvu)%Kzs&G%+HozVNP37g@k$vJ%+zA^ckd$xD&0Pg8Kv@7sHD7b0I& zkG6ZS_x?}CneuXtV(M5bYsHtefewEUJ}RRfKaE^;_d7$EZ#Cn;9(DF!c4n9nmeqZv zZi;X^ra97mT-x_4=dt=+>Y~|V^ZH)I==8gSTb18>OepwiM3_e0f|W3tsx1eVC$5GE ztCga0S#Tl=)`Jq~7f{D7X$cvvCU`Kzg3Erpf{HSRaT(I`yG%#$*HP+>Td1Cu1E zL7{vnJon%L>GYSHR93D*krK(eNMIJT&JXMS$2bf~usV@&Y~*0VhgZAP*HMgPd?zjC z++msilKkCERJhMqd-v?yFyT(gxOHf7XNoaWrSuYJ*B zEt_21i>)*oJ*zW0HK16kvS>RjWmJ3dx5jTsgShQi%Nr-9l~l6g%T+q=ohmgy0I*9W zsK=1nMGD50Y>QL!Qe{wdwKy)w_BnBP*o0n{9F9a?d*G$_pRuOo!?lsYLw?^$ZwJyGadv)D4JI2@R_G{OD zg+r2HLbeOZ_oMGeIZ0@kXaLOeQsU-s#z#h$SZ1lddXMNQ~m2uGIss@pO0fY$C-18_WBUhM*KXmtJ0kLou^tV zsi?1El)DRgd1&Ey^QtN$dT1Cngd>ec#wxHEa&b2*%KA7 zBZg_jT@e07P;}4J=mEIPbK-zC|Bkq0OuZ*^3#6~hHZ^m>cMf$VpJ%c4yO=Zci&y?f zc)^kt0jZfZ9|!pLg5j!;GGJSJ@0DU?JZ0Gs5avHZb9kiqf-2-Lz?0AYFFiy!JR#;} z76Wg9)BZw=1$5JxMXSY`KWqcl^+$dTH>cPW)CGb)Cwh1~gjzNB-q(C@kMC)+CE+7x z4|@n=G(6e&Vjo*3C+ca8xU~bVKEw!5ihtGea5O=8`!+J5Do<;~IJmpUT48H{ycP!; zTB?|6RP>pXpuImk5;>86(mE`E%CrI!dOK2=K!U)pWK(pg8x(q!(d&$Z%$61TMn#&% z%mcb#3RzE=VPqwJT zHKIQqapeP)mBoH+H?oJ4F}D~aVy9pomKuW7U-Rdpk z=txx6D-iK;tN!V@v-@ESj$9Z*@Z;pjp&u4<_0$-hC~nCaccD+$!R6Za1R4F6>&qkI z(spO{v!0VBmb(BtKk9sB5X#7BY62pb4bpn0XmrbjS%%8$D5~tj zLnw~6o_W3iR&5BVFb2(5zQ3e@Yk!xlSh>+`#|O5U9N>^JhuN64Zgcifa-Z<{xRtB7 zt_c7vRP(Y?dw4(cShs-0u-_=XpIH+p9}o-Ebq7}gACDePv;y+3*`KDjA(J?Y!!hb3 z07njAw~=P}ZbSOb(dESMI$dE$UG&P;()r`H!ptGRS}z}2FjEiA?dLWuQZs=v#8RDe z6gnHLC+bl+l4Dw=`PQ81)VN7Kw|r7o^PdeJ1fw{;7#*{tV-WaCVTyuFL->+|rKZ?> zxGu)>9Z|I0_hzFVl$l$Y#51r+c{T|VCjZz6bn$U_w9s?b-lJ+G&@Aw-1j%Z{#M3IN z#s$|P_V=ND5!w6SX0wavaC!{rGINMhms z*I3{}wBE)EyNyJ(ykOeJy{$^_sxtPm*7vw;gM*|S|DQi>lh!A{*&K?N7#S^qJ*hF# zf&e(&R)E8<9*mO}OMny#OUVyP`D}oega?PR@R0MZ!hTuE@=i(r>iNbiWQs&JhhD%1 z(xMk=4k<*2r%S$Jk=xhvcO=CqiDDjI*yB9$U6?boUi zpfvK>vYd{^lW9c=3$GKy$+^AQEbe!CTIL)70bV`6ZW_wiNw{t)he-4 zD_CmwzFi!99S?)sJ-^r2`0tRFmgRjS3s`6V;$gCWdAshCck$Qmbajl~FLSNIYQW43uP&Mjb|3LG|w(D)U$?qnZ_*^w&5njp-dQvg~Q)9rM zw#^d&@3|x2v}{ijsx3wcRo6`3C~OqKuF^VI+Ecq@Ra`{XO-$Jdep?ZNPWgbo4pNUMo68!*5E zpg-@41n}o8WV<5ZPhS)GchNZ5{iT$x4Xy{nwk363^l{}yh46M06+UrTnBx^GXusNo zJ92SQk)2E1t2k5Z^r(xP)wCCVU`Nn_n%AykF@;`%eb8!$|ukP=5f_71EqWK=3k zr%Q$%#~$LFc(w`y)9ta%O=h0ne;PCtWIzG!kcPdd)j<>80$CQoryZ@us$#F=nHWVO zj1o-!TA=djA%pWb#hV14@q36r5^b@YcaD>OnQU3)Khkry^7fqX{`BRdnZ2%-;-^$) zOT+$q6;Go0O!?cw{~p}`N6zQ}>qh|aN(w2FoWqd9?#w2{EL@4e!(>c_r3TRx&XkMA z4Oe5dVc8S#MfAoV0+pWzo9)OxHzo_Rxq?$5b}$PRmZ)4}A~se>#w3mAeaHjn!aqVo zpvyMq83%lY{}uHidTS-F{C`GH&xwONM>?TP?xne@JfBd@KNGtQC@@|e;x65Fb_sEp z-8)R{>WZdgBLrASZA9hua6W%0jxEM^_6Ya8;|3Zr0=(3*+@32~UX z@NwvGoQX}K+>itZ8B+~_Vs(s-3qaW2>Oxwh)87VR4}hdUeUzvHkH_$2Wfv2LghU0Y zB1@#UK-I_X7-7S%5L2r~0ZKliHCs%NaRL~h))cz3inOVo)kg(udjad27OPRyL^2@4 zY%YR?B$w`)K+M#p-M(_ttM+1~(?Fgt-_Hc}m6K)ke76Ec3Lu-sh!gL3ReXFOXz8RE z`9HRG&XWW@B5o#H{$CT)da5b{P?j_D%R=(!SH++2;e1ShA~ozoV@{YpV_Ctg#i#KJ zA~WE8A8|l@IDUlbR9O1N6zx(=>ig!;QF;`ZoX`wYOeZt)OM_Y4CfLCL2>rmjs(mp@ z{FeIH|D0IKmVZFG?c$dICvv(q`yE2Vr+|}TMcZLm$me9=T#(SX>Ofy3=np$ANO(Ez z$i3V#M5sQ-K9Q{;=NV@8XmD1>(_?P+hsHmrkYoFlMuvkP7Z$XVk>KW{Pqk^FL?SYPrV(U@Q%zGKiY#g*pw)b=vx}uKN6~bqLYdkHzQD;_x(7s z`;NcNI|PK!ed!h?7YhmDJwQHBJ| zNG{t#w%Es2w<=1(?L|cX(vd;QOcLe`R@??@8Ih)W5)x^mq$w)ieK?F#U7}I2e}wkY zu8D*vnsk+V{)Z4LuEh)GE!?M%0{`ZNGz=CYAt^(E&C#ZaeWLSuefe#be0i1wzBN(A z+ntUlK7_-2C?EPMGJEM;$$@ac?@`o)inOVrSIB~qEZ zLu$pS&kLJ>biOkGHcFe>PY~`6on`iV_Lt;KSUYZlEbJbdie?a)8CGv>O;RFin~lya z6Tcs@_;l}@h0h%SS0FL^|4R+cSO7?JA0jXepFg6|O&$8e;B~7;7CQ8-wRMTC3O`V{ zBZSUX!^?;#EA2vNw+V z2$wt28Kzia$)Jo6S0vfn^U@)I% zPk)aaghm%T5e^_@A&tL!&POpk-k(g!hvVubco#WP+(d}FuBr;Z)c-VX)yriT&u$R) zj?vN*T0QjBya!A}6e)hw10zQn6sOY^#^AJju;rPr9GDMLWt=otn+Zlz5(t+suCT*0 zA16|_lcm#HIc-P!!Ob}gjkFXXhdK$FH_Bo$+X+oN70+yw&a`Rw`_8$R|3Lhmkoak= zC%B9HAy%Mtt-v5f^_2Agla~VkGdO07gr%SdO8huo0>5Gb3fj9@8M3r4Mzg8_i7R7< zP@JQo1j`|b3zTw{eiM2sS|9M@Rn-5FQ0SGi?o1~eoxuOt5JfvBJDwFk?0;-X=BMIL z%}DkOLmwT^)_F?G;=GD5Ii9@DX3Iu!%gddmJ&m!zGNQ(4nnc@}G;T98JoZSd>-;@@ zBWL0FNc;_j#w_0G)@F($Ses|EL0zWP0d~?W*sQf0~?75T#iFR0m8&Ww#JB% z5rCtyz=4_JQK(#R&vciyEBrp?`44n&@|Pv4q57rz#%7omAVz58)?`oyPh&(TsEknz z4J#~e|lwBHX_6Bi6dh z=-f%m>{C9N8`ODt#|nNX{bbGdTndiOjh(p|)ZnGJz$3imVNjS@QlAi7HX$ z&m`w%3f$pl7LSxYpv871qczE>_=OHBQ)LNS&9T7gNs3i9xRGM%`}nb-le@DlnV~=w zSv4cTuveI9Z&`ngXB}D?DrGl~hLPXQCC8hP#7vW5OmNy1*sp zS5rUYl~KvYd}>Fa=Faf@FlKf@%2NT)DVw|4iM~MO-4fCqN(`~v0}@K`ZsD-m7`{v~ z_Aa9(iYpI6sWJwRT_{qp$6X$fuYP`y!;DK(v0xIVg~#l^7Oz#dM;Dw7@<_j;UFx)b z^PfT^B34>gM?O1C-&Gi<szCA zgIf=xcWTKm-P_jRIavpG3q4(uLA0-T{%$=tW^}h=3(m%o=3O$m(%C@`OGXMiJVf}T ze;^3idMuNAAg5W`e*5OmWnQAAOtg9UJ@pr(&zVTL)=e;=ImCPzneS5RSD3IbbP?77m}B|s;amYJ$i?2~pEtgM+}A<;5UGUuu- zWq-AbK-_hB8qer+zW>Ve@g)QLA6QYd(4WgNM(U54;$QIGEZpBTwMtn?OGiE=2&?k0 z9H8+m{zAeh5FK0E=tV`$cfR_0+`$Ec|pRG9_{ohp0Re`W9aRM~}*ndEXbSzhOSP+fN6sled)F zaR~T*o$3FogLmcf%y;bRf}qRg55&&R-S2x!6A>o^e3|MWoO=mx-u#|w4=q<~`q*1e z#q8eT8kRvI^#dg+cwg2lrNPI`1fgiP&JiHlHegMOk=2~zA(FuR*>b);J8Wz{E)veH z%B~4+JQXkTGIpp#s}E|Uti@`& zenx~<+TOcsH(q;bMLy7$&gbRFvq#>+yV}{R?I{s_rR#9z`{tD(0Bf(+Bkd^Cz{d39?wvV=a zI=s?j9u1?3k#30hjj1~Ek|d3vb~{>${@|Ud1o+gaSOp9`jB~131O_^!I_(&@9A&LP zn60l5O>NZph-Cj>`|&eys_V}`TXnw8n_7BO$-Cc4yb%Tg01$X5#+n$0InDVMEDL-l z#|$=35*t|Nlcz*^W;ZXQAIA!%$%@o_%{l(*?5w9lol|Hk)y_;?O>VMDOmRgbxAfL# zTEg7B8%c^&Y^KmYVb+n1c#KHK_yBh;A5ytvogap zkQQrjv}{newwritY7~+{5-$s=aFdurbHI=+QuUIuh{jxX7AjIG(I13O);+yjz`2Xj zz(#M1(dov#5~4ZIAsa!L69 zZynkI&=yR-#(RK4dZFblgJJ;nmK#K*8jjgY&7?#13#gr2|NB$^)|gn4E75`?b?$rI z-y-TiBRu1yF4Go@&RNCg@q;fXHqJb?_cpHUH0##fsvL~YXj65%KGx1JOr1Xb2>ZFQ z^E9}5Lcc9)R(*EHtIHpPpT-vbu{ez-oPJ7GUfIotsT>@E!*_yhnrjq;Z7T=M1s4m` z+NZ2oFmpzyZJ(SAbA&+Cvm8QH-I6b^@>v@!D9#Es?(J)CtwU(eV(74kH=w0ci(hOO z&L2I5?#}tU>j;(wthc)mybecxcmOD%l0F)YwJIMxM+xH;LK?8DF**oX@%-YI7%W)B zJUWeP>Pg>Y!4=Wl%B5mIuZZ<-Pd(|ABIC4;O#DY~=sZ?`5W#GLq&m+xfp5CAuF%B@ zHhQsU&iW;a&xQ|yA1>pLz2Cm{dUy71k?Zz@lgn#r#EZ)%A_uRexA`vQk6dkCQ;)Aa z-uvQ`jZuB#-JFY>+l9r4I$O;skc2WM$AOfIr6kD6S(>K{YA!u4ZkW_0l8WDC3q%S& z^|nc{GLxx>GZ~1i&>AZijxI@$Q5qX|<8DWb*Hb%(?~!}! z< zVZ`3d@FBsFemi^u3I=&e1$Xas39U&Lj{BTJwYo2F@c6k#iEkQ*b)xFS@YUG{FXSge z6q|a9=EtXyOn@=;;A>^C!21QAIq$KhnvHEEoQJd3y}3z6*|kSL-krd%)AXd9zi#Ev z$d)x^tgrLp-Y5R~yQ4JT{Q2vl#Mbrf5xsPZ9zf%75ML~?M0-k7%xdN6a(Z?j*mfuM z&xG`YQHISFHSh&`Sj;h0A(-wYn1NtUrgs=6!P{2^v4H=Ly^9Z`NmTK?K-&X|Q3@Yj zG;|Fej;YR#(R=qiJe)~8$A}0Ssd!*JpX`}R2AjgmQteNBC)TLCf>vb>KpI;-x@3fw+A|Ae+DV_jNCvnM4%|o10B_x^Y zFz)$=kOs6xNFMHyBu&1Phz%@MsUAXn#e|vEy-0{k)+B1HGP@UGLuV7TSK^lJg+oy_ z-uoR~-Z!WRkL7(*tjRC;dlGM_EvsOk(--LD7I8?M2oK!>F>C4XD7eJYGZ=Ca-Ra1K zOW3RZIe(5AH?GlN7IHtP5e_AU1j63=P}%|zw(sUGCdL;G zS2ur9liX9uKP{djuh+mOQxoY)2 z@@A{1^rnVx7Nhh>ezsm#dD@oF)5JAHQ<(;T;|0{*Qr2}JXuYocZj#4SpQlXqF8$sH zaYdlY1ORGlNCnWP1&0PJx|nYE3uM_F_s%q04{35n7IEu$6WRIAge6ZhkoI@uzf=#` z>#LquO!c3tPL``S@y1Zkop%kr8{eah3Zv>(5E%*~AgJ|aZ)gU#CIQ_KFUhIJ_vl;Rd39l zm6fS-h8kf|a?$j`h)8(d9D%xP@5@`P!Cr8bRS9Vz`8HZ**f_rJ@QNIA<{Q7Yk7q^=s##d& z41d$0*T|+7JVsxN>d-*G>Rpve7!(0%;g3)mva*)Y$4W~C5eFj9Gd8a626qQgZD7Pb zMNtJF8yhwc*AIa=Gws?pjE}+5!*-E|Pr1*~OgYY&tsXO+xrbNjcFZ>BP}}BmN(|Hz zAFSR!sHTp-0kem&f<>&x+oYn7^HVK}HDk)b;B3+98YdBs9e5ymwb2+zXF9en$*so2F)_zA4 z$3MGqu-17D7n&RArh;OCbDp$18Fdh=r~kQO1fuP~*FCvOtfv-01M=F}8FT*#83xZS z=#9#sP+joHMg}4M0Pu#pm~o)9!&B*nJ>I0lM&UCxf_0Vxe_Gn5ocGdF6-)EzQkAl8!66uR=lflZ!^BN98;1= zgN}LrJ{8q=lA3p0r5acLc{3dLI{DqV+lhkjN3XA*!rx4&6IEYv9t7;2ED0j{19QNAmCwjse|brFBev}jh(r3j1+c_Zh!@PA&VWH*iL}Oev`ft# zb7g~^h*DuD^o_n2)zdJKFZvA(CaAr9Ji8O|yp;MG)Mr{izV;7_GT-j0!09O~q0YH` zrdbB2IKu}577{livRXEK>2JIANB&Wgd}WeNi?ToE=Z!Gw&_b7p!dvsr5R9HB4k0zO zEiS-l(vFpL?yJCiB}Y@%%Wha&wO*dx|x}1dhaBrh$HKBWmcxEEd2@5 ze3Q&~brlKzqOEwVHVyiITRtqAbBV8vzWd2+v`|M|VU)b6pt$iTRJRbt_*2McFG%V}G zxp5xiO3u5jGL?;x8Syxc6v@zozy>GNNyPH@GI7iEqj0H!{(_n?u*NXN%>FB^4~C=S z=nW4(ZRJFY?A{eK0hE+cJQ;uCAV+3vpJ#A@w_05TL*5z}ODv9g+Ssv=%HdbkXkz#m zLz$ry{}N%_5omN+trwG3#!^#5;`gKq zQJ8P>+IYWvN$QQR%y^n(q=cMVurXSWBiH*}sgkw4mdX$JUv{-4Cxz8JuRTMXcgH!-3YkM-OW7r`u<^66elA6Dj{Q{L#>foCAbdRN4H=$#h2UmbHP zimlvtumOP96l28Kw}4Be!*zYRH7aF+UrG@xu|O^hlM0_uIVG=NUqESOn=MRrk4%zZ#_C$+Kq+O2^PU;{AVoM}G!X0oYyiwQg+u@KV^{80NylCSD$Nyx~8 z59UX^79;_jE$9d9kxY&j;0ug90j3`rm z+`CevjDta@j?nKOh%(tHb)p5tHAzie0+{%BXpY6mG!=FfDqIkc2I`LfAuhg{GmB{1 znBXPyu>O&nlcS_v<*5hN3Ci!wBW3gAl2O^dcRvJ$I}v0b$2ap3Y$L|43;*aO0HERbds=9mr5@k;IA%T4(8kB|;r0}L5i z*{9xo9{T$b%Ak!~f6r=@;XeGM!91mhc3OqLrtIa^jnLr$A9FrIW6U-+YwdST$lK=& zQiQCT6TpX5T~#u2o9>Wul zf0xeIHdktt8+eZu1}1tD!ulaoI{`W7)f~_G(w{=_$8>~RyQDP3Y%o-TArj+8x}f_% z2XYi%;PT%a#LbbI^IsGYES8x{NfvWuT7@=uLh@}wPGf<;yfCz2EJVt0S#KfCz+KP? z_hq@RpO}+plbvrZwa}xY{e9pTCEgLK(H^Evs{e*q`940e7#jmbYOuVpY_NK9sp}0B z+))cntP!pKyr$69h{zPcz?1437FHsRwwUSN{wra=`bE#%>dNHA=#Ixol>i9lA>aR6^;z;q)gN{CJ`gVm-cc7i8oUknV z?#!F%2iXgz@Y+@iUgKCrJzC~l(Lax)BpMDA@s@Z=LrL!$1yD-S{}J*AkTtkQw$ET z0DuCMIk4uK&~2;r;^_wQ-ErO3;qjx&llo)hJ_(cXCf@z)y2FR1_nqWVyGfE#Grs(% ztrzi@t8A)cDMcr-ROO!lsZ8v~uqKXu)2r0oY7ky9>^RWsnxjzBQZcuJxkZ60Rme^* z%UdqmwAx3qX3_Wzw(DWZ?);bX@07+TAC82`+(g1T>5A;araWctn??>Dmm(ubfYqt2 z>`zW6q3Z$kvRgtFQ~G@Lu%k<{uM@Cz7#NupkZwPNO*)-r=qL?6U zt-=TwAYlqg$s3WL(GW{cA=aaPOu7N%BvV*f6J(YK&(bH!D%Eg(nS~yQc@4@`T+haE znSXdeq)RUudYd6H_jqY^B6^0n_CjoY5(Ws+WiuuoH?Gtm?0EkOr3YVr(pA_xAu;Dd z$uJee)yMVB=84GUgHPv}1%>Adi=RLJmu|%Ek@90J_i4a}3t~L5()pj%GX`%r$q^4T zCJ#@Q9%hR}&*hHb zJy~*hjm)paUWV5L z)yxzxA%tpV7ZO%T4(y?ZNfiB{SH*R0mQ#3|K%H(G($2cQeMC3--B%A+yvxf+?SDnL zB;hzn!J+=v)zx1&!;YU&gck;=tj<<@E9Vza_6#; zr%HZ;i(zE9IckIBQ*Un)D4is!92eE?(UJDX@d+yXRqH2c=aqOemJ%jK_^dsecuKIL4wLMs%UsY~WGE>5$ z_)X*6qWT+2gLFApR&3Y$AQoZ8EHcYHqABbTq*Sb40zJ?)#08pFUBukG+eK+uR6Upc>G6b8iee`q0oEsM96$t zRSZi2HzkHQqJ9RbjA3Agr_`@g^UnqTQAWI&T6HIjZl;5yz(H6Coc(dC=|EW6hb$}h z(#oW@c9YL~9M@~>7Z^NWW=qJ}3!F01esUEqP5)%mK3Kx0T3gv&VU~iyf%kejVc9I6 zm!;E&UvF53!R4rpY(G3T>wZbj(2DfZGrVv0CU$1qzX{i8pP|~3 zj;%lZT09I9<{s0oOq1VbtjhEX(4CcMIfxtyf0<$(6WZWrbyy=OxiNK-CLLnj+-8}nxlry$;j7Iau6?A(@WAugO=%`ix`-4829N?vm#OBn4D9We{+v1x ztVx#$WJJ$^B^=TXW1MhZx!l1;=C}$r#n|6)LNbP#j*5ROrW0A46cOwOm3|NzpV{TI zjjk_NKCTyPhv=z*l)|2U#bQgu$%dE|9Z4(&k;!5y@gg*zZh}8G!3$;_GauVJ;p}+< zvz4>p0tlhqtT-?Ef#1R4-dGHbWcy2m`h;6sE8pMU;CeqTRQK`Vw zgUZ(UPMMr}H>Uta#4@=GIse#*fuJ|o;zPX%y!07zEKF*=TShDAsBKgWOD&7vk$I1X z^_(JZ5oJgI(kH&crxgf zVS;YYv^hWnIZRA{;2oq^W=gI^*G;%qoSvy%MYeB`Nom2wl;YkL9p58Y?>2i9=J7G= zZ`8-7ew-U&pBHqesNYOpGd6a9-+4}PU2}oCHP~}*Mb%K_z@gf)Dz-1__p?E<={7?U zJ_FvBC{?9%y&Mq&4N;&!3%5{&E=-qYK0pegic^m=xw?mqQNiq{xEWLsi7 z6&Cw&X@w=1ImC!!2IBbDibEomBJpnC%dmwCpAEb0RW(5vuqz9{`qMxNJJEl^5D%D% zV|#C6!HjCP-Qu*wrgYVf)`ZnNO{zZ z?19CMB8+kTxxb6FL+d3K1*g0@*Bj1`)oDAq*^3$1(b=jrgwT67_wa}WC;zP8Hxd*u zkmHBSc#)|)ct7{Mk|N^()7$nOb^c~TAUq_Jdk@Z;Jn{kQ19J(Ii*h+G%k}m1BJt4r zkDhgEV+=$Fn?X!+bnD-8KhlsVvl%8NMw_zBkxoWO?Gh=j711q}G}y!!dbBn;U=%9| z^lWlS;$Q|PzL%rOb8F6WzBh8JnpK0d3}6!-1hiY^futD zmdj!xDy~Xu@0l zZUh%M)r;iOMwN?js0WPw=M~p%r_MkK9dzbHKS#|iE#GPbu$!q|76su zh9QtZxxS>3RyOdcb$_%gI#*A6D zF=G@-ie#A2(^%uFKaYF~&%e|E(5 zMO|hr;^x`HA?UM=qCSMkrGy}fiOIN=^@R_osS%(DvE_XAHi#-zLM>6eR&kGy?yHcg zP1`8NFSgf9!ikb?`u#SEo4#wJ(1knGDfi3AtSKKI`q=Arg(}5Y9i&<~cRDVWx9heK zj#n#dl4@jwOSDR&;SWe=XsJPCmW{f_t@e>1N&%{In{ic!a4*W!zWhkL;)v)O<&C{k}VBPt>qiH}^}a5Kx_OvCM)c zyAhauj3$Tji5aF8{|+yUlaDAr;)=RKBBMgVfzwKFiIDox{#O)y9!#<%G8}?$RVch^ zEBzWDNW%1C;}laH?hYz2i>L>#w*~SAa0Ti^IkQ`sBS2k-UF9x}5BiB`l>>L__-j6# z*ei+?Gml>*Vr^FcH%GcKR_qZ`fU$+ZP;RtikO>xl4?!3Iizw z%bn1LfJiwkxru9yBuJV)G1)cm1>5g=&WvwD*37F5uJ74g){ptpj_lrO>MUq~eUq(R zo}#sI+roYGm^TyMHFW-U+Ouvt5yO(^>@YN_vM#xCh4y<`%IX`Vqn}j|bWxVJHuvN! zb%m#nCmU%-q%Z)Z+-V_Kc$ybnfYxkBcVe&)VLj6rQZ!Dv_ zsM8BKJ!qNi@E{~ID1U*eC--25y(%|F!cDFrEu2Grv9A#c+g&4;55+9kcKbwF&p$r; zNiu6|R>UYxTm_>F)4EpoG_PNr)(M1y0W6!xV2BKaOhdUkj(;w)fj3kpYF1oiudh7= zi)@zuoH^JaZh3X&d3)(=y+R34;Ia*bhGZWbuwfQis1zhH?It%3*c>gf@0=xEys{k{ zo?y>gOqh_(DZ8~z9Q;gnw_n|%L`0KPRB-|$Qv;n7<{@i0&7mHyKUYDWtlZJ?*1o_D zucM)<1XQ$omG9wk;Xq6x(5^@)jGM)6q={1C7WPd#U8*jMXuR4AnJk?Af?2nsskOf9 zo@HEuwhzqD6Y(h>9sH1J?8<@Kl91kdY`rx37%bLkz-~t%A5NCm?;$q`>!|!5_l)si z_Tl3OBK7dWHpkytKU4MRRXNIUew_Kf#-~pD`W3;EmjMqR9^~w8sttw1 zJp;Df~X9A{J!zm z>r;y+tR_mhTF$Y8cs}11Mgr%FrXW*cd90U2V@gm%BU+(EFMX?e15@82NJZHmnVELZcewB6Q585J1ZSb1KI?{`+f1Y@x4ZB<`Vg2A_V#J zB75x4isG(m1qvM@+%Ir_7e_Id3@8bZSYUY^6;QkHcMck7$u(dT$8mPf$Y3X)1%e1p zF;%9*0sq8RcX=AzL>xGHnM_TdI=DqB3Xcif@yZMJ0uHFcUWNRCOE7;C&# zUq^sKfJBu3%=GtJp3vATD)PbO1I{Q&@B_dY0Sn!<3Cl74-D{{l>+SJSbL`Tw(cKnE z;&OlZhehG)|0OH1ea=JBiY3ajh=ym;p9VO{WQoB|ex?&`T?b^h|2XUre4ab8c-W!rJwgf~N)NH<@0_@4QVbkow7X`H@$ z>|bE^K=PWVG=+u4eD$>nP7k-?#!K0tm6IV^-GELbrzSpoR?F1*roGu*n`pMs4zA`V zw&!4`vnPR$=gv#pCb>{x^?P{KsCF5*?Z$f`SVL-&5OgiBrkjhjZ-uSGrS%huf_0SF z5G6KJfo#SA?i|M`UgsPBChqnx0O?RQIq0hdlGBDVgCW|nC17K zT)Z`0xaR$xQFT*kU&k6A5WNvg8<|YEwrp+ z9$gy!O4^g=OijvolChDB-ejTp2xvuJrKyAhTf|g_2>#wQG);0VG&43#1+e<4Wx-tV z6s`m@lz|fB)lK-rf5)M9Z>g(U<|vY?hjbay`+E(F$9JxC?x(2?{+v1*~IRkHl{SaZhM4~Pyf33w6e>*b%pZBj1?fjS)`W8K()cp>SD?_ zO&X%Oy{Dq^1TTDX+eKRs@!k~q`ugy9?rcB`7UtfY#QJt%yOT#XHenW4n04RKg>y(R zuF`wL7h!hSfbB`5p4jea3m%bP7GK@#leP($QiH;jH}(?h4yvAX3vFd5Z;5WZ(EY!H z#>i-30oNoG2KN$^n4Ov^EC7q9n-*0#TdX$By!1~jpe{RmUaHCpduScgz*rIE?bH1C z0MTRqZ(HAfu(GT0nD3kaiO(|!g#KZ|k+&in!i0BM7hiZ0+q?&kSoG5 zTrU{UP-9}3?z2AMbzlB)O}l!z(zPgBJ^Zrz_Hk*x=1^l48m5NmN%~qPPFhpaE+l>8 z9BceU+j@|sSiX+ppvS=bNl7LFWM2f3JK_l=Rhg%^$JEy1x8Dl zW4v3Irp3==SP!QXo4C$IfU#o7#rQzKDvB>y0Moe}F!3#1ldl8PL~w-zm#B$atYGxp zQt{}E!-<{YmmSCr-?xFC6)|%f+MjaeFb%)50A_JAP5#+p+vkQ?_rX&ky4zRveL>w` zS_6!e1Y0k6eruV)f}6(%seeu4%m%RGJ3VRj*oLKkklO!$I=DU6o( zaMr|RjL=z(tlG(;QAitK^I8vRM-qw^8f*^Y$jG$hDY&~i^%c~@L|yV?RhGTiJ^D{t zE*>#blLeaeQEFotthE-t0D!eFsTw~o%k{wS-TetAh{y}<)w}*)XJEHjxYHXPk{7t~ z-C_3nNLF-q0QG}0MP43-d$g|R!INraG&K-vQj}Uw(48zRLoZb60 zX(W0D^eRvAVpplIc){LxGw<7YG&6&T7E1Lt{zG*w2A)_f+~vsSyWSVi;+ijODX)t= z!KPcDfo$D>(u`(iTBU#FSl6_9O`A)Nn%RBKxgbXmQH4N;BjZU4#JwJyA+G{E(78|a zttk|^KxU%lW1=X>H(G?wLN*y;=P=b}=*v-#oNd9*!bl7LWG<#9*6Au(eM*lOmTU{& z?Ll49%SWvWpt~w6qQRXxq&#se!MGNU+Vaujd;Exv_~~m)z8;KlpKpKFb1`< zwT)$K9d{bWV%Mp=!R?n~iIGK~KW6*X%lmF4v$7}zsKM^iUPep4g>^U_02YQQbBcIy zj5=I3`wgh(gV1!KSTYiv`ASq%vmuJTZP(|QrN@ttz%Tv0W&JA4{eo? zNqFyt^`=|)dzFn=0h@my#C7_~8z1?IgV?DGP~#{5rKm0|wsjH-R80hi5zL%3q=t$j z-U3z*!D}7)(LiRciqNGQXk#$QBtaOfx_rn;U1fFSBFKn=s$22tj$$95hgqX^n1hRB za20(duxd(giwc8S)j}z3*vw zj%&Fq-Xrgnb3z1J5Ol;fQ%SeTwxd_S#;!)g!sbc=@{m;$mn8>q;+;58+4a@`y#7yG zE(t;E-eLl}9l~S**6x`>33Uw7GzxQ1w4@&p0(is|M}7oxjbnVgjP{+~m5r*Mu7qaMnudI;7r$Cke8Q?F z#8kwHB!_9}4!00bVyVgU7}GZ}Xyu`>tUv_b1zyo&oVvAg^0LDGu|MJ7THMVS3Dfzx z^1Y}fpaN(Q)oC0m8Y}(4HE7B7%+4dk@+iv`F@Y$fZ4r}8xJ(EYW>COFwYQ+%_^&;$ zwm#?U9FRRu8ye6VEv)=dCA@`9ow_LWnft`Q1HB=%R4RpvML(=8;pI4qgVa4)er0>< za@Z<#Ox_suYWCWhW(InXxVE0Os8_|UExI>hbjkCqOj#@e%vUB)bi*X&c#i)R*2f`w z;~L6FFpyI)N7f#Tp%`JCGf|?_1jcqySPW4x_{C`w0C3nT9M95&EtsZq=&a{)l1g_h zzzbnvNTYa3hMA1D&3Pw0@-_4NNkymfz381J!B*zI#at0lSdt%hK1KDF0&BW6!-7iABq3h z1?!&C4Vp<-ktK|v`(UVvi>H|l`#jg=o!P(R38U6AMm^>@B(YM(2E&Meb)X@Jepg>+ z#J-AyKgrE6kfhO594o1DTH8Z17K$fD;otU2fo9#5S0UX>jl7~r5D{*zR9}YTYJS1R zPGL@(cAr}9T9@(g+*WAs@0wJvI2kwVXet3+n(^{nMK|`(h8~lO3)V;IjHZo}iY3;F zcpYC7Fg|{%`fW=rF3b&IERsr!9WQDSJv^5+1sP-;Bno*=hP=(2LLdrqFv{81wnI-~ z0y8OkI1zi7--?)Frcrf!#N*SNr z2phKsJ56nv5V8^uRtO~;O`u#)x_KC8s~@iRx)wG^ZX@z@XLSl?A7|e(e0?fF{E+HP zHPidn$qmAUwz%kSVr{>M7ZH3VDXPwzj(cZ0MH-8J{I>iwFH6d(fn={4s;1W1Eds{t z*a2hY44*y${=6auk^?XKOBY$)`@GOt#~jFRGeaTCND#^!qP_loNX~D_G-T(<9W=yV z$cnw3Ty>`7tCU<*19>GaIjPHbcoq=-ZUw~_C0H*W+KtztmWJ85Sl3F>;1+`2YNn-y zEuZRUqcCXBddUA#VctnOnIMJJRzGI|3$$N``uU?p)rI_A0(Z8xO4)?f_CWJ~4l^UG zQu-M@YlpT-BD)x;Qn1RUMqXPNrUY8~+Z$yUh2LEYN%+aekxtBN)!W3e@B7Zx5QWa> zX4S(jV2LW^`lIg3Fe)eN^p=wMIpj}G{N7-_n1tS*HSS}nN(xu^TjyTiK>36Ht6=}+ z$*VCS7l!K(Z87!gy-&k8f%6ap0d>LDO-`l5Z?N=U;{=0aW}CU)%kIMe2)Re!1+q_! zFsp$jh)lxat?IqH0x)0n=g^k>-+(9y<%ON<<1 zj3nL>Ycw&e8jw4?i~V!uCb<^%FuA_GPqZS{8O~}El($M>%e{fy?e@eaqj#O^14%Am5m9F&tnwnlx^7_e${C%(T@}!BHCZVC$~#2 zzF#Lsy;mE;q34KXppP?(R}j6rqH=5+i-Y!5u~LBxZOc}c&rjg7zeSiDTVB+z+3n7^ zY5-^Hd*av*S6q+5%JV)!)>P?*dJeaHXJ`JsD&KHG+|n8$zhs{7V%eZrjYja4;BO7H?Yk{7b**?xg7R zt0?59_T3fa=_O>79pd@`c_qpM0+3x9p z&-JE|H|wInBJW#!&H`(~K%s8RG-4C=u$9MP3rd|$0Vjzh4U#>D)PICL5rOVHa!g2M zr3_+zaSU+)>|SRQ=za*)3QN^8BLq^Rq;;*~6yZXFdVu7) z^K0yixFAGzQN#D`Q~%EWvs%9~XnVV=_X6YH;#C#6>l8Tqr|agh;-?XlxcLYw z$CxLj_|hyDmC|N*WT3>b_a*LD6U%!D&=Qg4c}V7su|t%lJFF=s*+4T zY{9-QORYz#X(`=uX;kgwV1M}-q;;ePuNvrU?*D!Avb`z7j0LIiS?f`gb0slAq$P= zD3~c?XN8q8v8yaeP(Lq=wZl?-wG)8S?TE~S;pMoeFfn2EJ~JejDp4qu>Y(KN$s#SN z=f@-|S`Iy@uH$o#zAwnAnn15uP~MwL9u9UguA(|9mP{IbPe1#`E$w+qtiQh{AYKVr zE??;@f@E}4q$M1oOw5ev8|kPSb9L1xY|7=zH!s+Xq#Ep`*I!f{m}_`->?5*#;EzG{p<_b1;}w3REolXH@{}{`IiS!YOIEs8`K}x#Nx2Rk!IUPg5kaZXW^ds4 zBX@z&7hl<1$m&D)>V1@h^P3GmOr$78Qy20E`Lk0$KQkiwk^<>}0R1Cm6}>VDO>HBQ zwXoR{n3=H%f%Bp$nc0^Ct)*oX&~+#RlcARa$DcFPTcMl9i&6_`sy16eSDN@i!&t+a zrrwe=$ZmQ?k8C1NCr|I-lK?SgF&_;H!anu@3Q80uh)!xBUh9uU#Uw{1=K*>;a(QgD zg--@+b1~*{k8I2iNP*_)%~|$?Q+oHW%{@^8@}t1O$miof6{1IV1AA^}*{%n?a34%~zEX=DQUkR(;sf2il{UXfbRMCea6{L>$iE(F(=5q@px)PicX7X~Jq07sbKS-2m z0H|gLfI@QFgcG_Vgtxcmw}_y=`sQ!%nwRfONtQY1A$t_bkSF7|e}qgCRvMJYp@b@# z?C9OO;cu~73`rU*S3zTK7Jvnm!5v8bU>KZJ^O*yuwWUn-QB%6_`lQZij?}K1m>DKJ zdf+t8Oc!InMT;PU72C3V?aNOBY5;{jNjMW8yRMs=#zHP0T*hc>Y6imWOlGq&=*&)v z#zV{)RL*E^NLv^-vV)DJy?{BA+jfs+;I@tRLGcoDv+R1%P~FjBO1+u>#pa`&dvxQmj0P{^9{E3Z+JOm0CBtxNax6A0)uP*b>Q`vTR7w%Qkx!f&#sH1 zDZnVX1LZUgef{UUBMcP-z%T;zrfg=gKBPf&3$+hp=*MF)oS9-NtZ{Th0x8 z2gb4|X(R}k7)sw0yC#i=)R{ilTs1>_!V4ueL?Mun!Y6F#rYr&oi_Hndu3yph!sc^x z4id3M3STb8QMaN5qgs$I6`|!S-sq_P8dN_C=m0_lT2Q)q5?^Ee*NW_y_!FJKJ7Pc$ zf}qB)fUEM{plrp`Fc_vJcuX5D(Csm*jYqtX3Ufy4~ z#Zo_zt|p%k0=xuEsTml ze{5(XEtcH;$$h`-pAg9AoMLoU$P4)(0B*0U>e5W*Sx#NnTZr_}S0f%7HbrJVOm&R_ zv3%4Sz5F3{hC2kQg96y{KISHU#~S9Xi_f~W~x_pHeqGhZeukz{Q*k`0O=Nf2X@^2vi$j*SiPK{X)POuG6vOQG$? zu-D}eg)9jG95gCrul+hNB`v^uAC%UqI+ZWD+nJF_cvW^+!rcA(PV-=%YgL0O2^vWpmUyKWYjM5 zs=zGqYz1g)L&JAs>5KhC2`(S_(bYs1@oH zbi`=fvgTr}br|)}VJM-O!mApR97I2pkeU+|MryTv&zT~XrqH~?a!5p%_X9Bw`Y`>B zgFqfdTTk2v8UB((-ssQ+k!`x96XRi$UvPjb_SuRt zV(hQm>}Bq5?^(-@8p`c8$G?KH)#c>0gu=#T5q}}2C|Tl;%Cp(PO&k(AySQj`zHdK} z7}EUmvq2|sGXZPqV*BneZpU@%1e=ghjEh@_$^|!hJpsoo%&I}1CW6t)8qaH`O^*P# z+TkEvsl0&)poIybfJ!FnRd}ucDgk&x49kd-;mOJV5z>MKCR@r3osur`9Q7R2l(S+{ zCXqr#k`qhORxQ^_ab&3$Y#>+^Cg(l-#?BXre-y2-)uo+BjN_C65GfGyWDSId8 zjbAc3`El%t3gbLN3FP%NS#|XZU!Kbgu*aH_EYb@YX`&6YO>NJ1g9)nyz?@)Q7^8*v z7<6euLp41`6|It$vp=p^2&p`5eA8PE;0x01J`x2#j=nuKgP zjRP3=wXUF@H9fs&(Pv*dQ$a|`>FFG9fR#4PA^?DXA~!6i4(;zSNw?>hEBW2_u0FF6 zac0p-e=}9ti#r-?G$~Fl%e=rUQEG~?nNp(JKO&v6V9kHno-XOg|C745`^SD|yLjYz zJZ+IUb9&kDAYekQq=&ka7Q@QQs@e=8pOj}GINs%h(2}(Db=??gn#Q_vY%2k??J4DO zzkI6&d}t_8!dhskIu2qwNLRZ1!c=E`jJGfm+THSxkQy8iTT@p2lw?Vq>XAe^oD9?3 zmmINWdg3yk=K4Bo!iB|73Or?F3L_-@q)>{qIz=M659d8&2l?ZUl(9a`6arc6W*Y^y zf8GUtm}u5N#!x0iDAXoa5?D_zo= zwW43m3zgg_k(&IMfOQXHrYqeMIVE_&Wjh(Sd+B zx!e}Lp6NSmWL+;M8JZq}$ogDqzj%cc&)NdDPJ53Tf;gs~;Qbe}+#l4KIh*Atq>&0d zurjWGyckPv;{1Kll{X1BHH?gFx@+^%#C1AOhh6&ut{fQ7e|UhtpdE>>-S_#~k9qeA zlaINPwleQHJM;5@d44e5e$UBd00dB&0i|Zs>ZNA>5mJr-x>!QjAucyz>va;dVI}aa zJs~RleC&39WyekCb=w=)C)?By)4OYm`G#=hq6h2QcQZBWDYp>Ft$^gXsq1qG8J0+} zfNK%tSJP^52h?0R5*CvRCD@F8Bfa0dMks70v`CxHgz53bad33f!kk%xEel0aI9!fB zG5{`l%^p9Ck~J(gA@uKqi%8nMyq$#jaBQIjgVxDcmm(6(F{@Jjt-MGOMc!E({m0E^ z#|8_RX78%_aAU<8Z(wIwF4l+b8*noxwR`93W%|lM{o&iwWi#{IrA&QtL!K{pxklJ8 z!7D}^T00Pk080YUYpU5ybgYqQ@A+u{3huobhoM|Kwj*l`B8Nbv?4dEmEAsG>M>$2E z2496JB%TofXps-~Ft4c$Q%>Yfe6m$qa{Cd1npioLh>)(-iAwo-JSHk0mBxsIL=0g5 z)4?eXU)duxoxiKmcErij!_A0+sDvP;Qt5rmXAh(Ln<}a(3}u^KWy*N{yTWkqM1e6#>Eqt5atfa*U&qS01caX zVVNb6dtIrUW*^KPHFz-nvDCf_hs2N>b?KZoXknnXc+cUYiR69ZEueO5|FhE#Qy_){ zrkYwg98z=xYow_e^kB)cTUm2El`~O8mQHfn9cVrP;Pa{QaUP4ha;uq> zHl*^*e)HvpI#Is-x@=;|aKge45l$&~^YI*}1%Hx(1beXq?x zO~=T;g~`$`A(qc0BCudch$QqQU{_DCPap31Pi~tG1n5SrnJCm2&V;Iy7o7)9RxRdkQOLrw+w)Ce-J_i^O&8WqM`ujf&C!?D7QWrS z8Sd8*1m!zCh)J?Y+^^kqU)KsCRUQyWd+P2^8G0GF`}S}9={|jG-_Q?=eTf%0)j5J2 z+MPAUT)72YOQDNMZpf*49*fouhl85fplc`{z_9VNg+o6s66`gCxlW_W8JKts1j*CE z(8rax6V$Jh_r~u;NF`};^UiuaBmPn$C8h6qipZ~%9%qTnBv4gerD@i*8c%U87)OpVMORzdRmI9_GYF^T_Srn@3~V15q@Y- zg9r>LLj}nE5pM*cqq3Ok+(QOke zAFbub6$U)yc_~@C;H0Zj-Z7d!jy&fb+3WH-cv7=*263%+bkEy`!^}DIL%up?5J3p^ z@sev6Mk<88IQALF{|?vMc5%>K-*pDX$OJ4!3)wcYIId`;`r6&ZwQq<(F%1(+s$=?p zCPXD7a>GjE1I4T4o=E6r{T#}cU~DHAl`5B5>gT59rQe0dsiC4d_W=2uY*Wv#5p38H6u=D$SW+Mn ztM+VYkH}$9F+ilOoJI~Kcz%p(MN!IkG#|z!lF|dAs)792iNHXVHXsZE2o^w4MO8Tm z)&vzk5&?4H@k!}w3v7Mp5MT}3CaO~TO1b0wCY0aFneiVQzc?i!>s;}kX+20jUwml2 zpwi-(@}*7@gD_9=vxSo(jN6B9Sa)z|P=cr!+s-k&5(aKWy?N-w%MVxHvI&h(O8BrC zqlWO9C%Ltuy~t8S`PpI8q{a5lWjWuloj@F#2j)8KZekXkDJbaCQV~cQr2HUYWXcS) z+DNF9JM-9RC@PzpIas)gvJ89F$~s(lF<LeoG5n za{N)^9NEL(ycB>cbeh9W;X>t5Wv~j5)K^VKg~@4oQxQ@9G1f+(78?NwoWU&YQ%k>S zP%uP52QUNmK$$b*)`%vx(J?Zm2)*&NQ&O3zn19{N(qVKsLIE>Xlw#XHfxom|UVL_{ z2b-$(5OIDG)V&*c zZU5!?>-|D-w`R#Vf8%xl%$No6j5+Weo%>||cRR>vi;#|>9Y4}}AY))Pce5q8QJ%{n z5!DEjVluG4*1`o{0?Q_nYIKHEV_~xPlUVtt84?{NqMSPCk;{YHF!` zWDVm@Wt|QdS-MGn##_kvT-!Y_?pTNG4QylJ;O^hXW z!i`6gUbw$De=vB_rN}SITCDeIPIav1-LA>Iay=@76k{9DkYC)Dp2qPrg#cUpI3Be5 z`K+rp{2N;T5mh~Np3uLuQa?MhueTxk)9-MVO?2LJ4ZGW$K3( z00>IiCChuavm+vhid&W9BH5g(q$qwJw)fSFEzo$Rxa5j?*!PT9A@b%3{;Km#)i&Y# zeJ4H^(Vmb7dtE{rX74X7K70)_JC#;s5!MH1tPtn<56>^y&X*;@fsRY|=h6cloqaz{ zuXdVIV<`y2T+LE3OCZ~$3<=6ppPWtNPu@sD%qWL@7oLJTw&A5GbA>vxJOc0a*g1c0r`C1Sfo zoF58UZ2pzY<%Zu=TFxz_@@V{*5SIUY(c{X1{}J*|1wdJe^(o=NeLLvYl$9@w77^53 zenl2QLN*V*u<)x(`*=)PKBe1CU|AT2r~r4euJpN{CLOkn#ND9qSH;8`KRME9#(@n$ zS_0;UdWneOt{U0!lGN6ZG!@6fm0{gp!$Q{FcvLmw?Sm(8n>?Qf)qHj~`JE@+tTdZB zaeC%k-23sS$$?kMlRIB2v~OaVBP#KDdgEF z+9v_~fX~95T6k+NL!Om-3|W){taj=cBwop3;kS3`_4^9{pY!(rk9ECADFBAf>>WRx z^`lhGN2Lf_g`^J|pzo|QwOa8?R95%sM)WHPq4y=y$Tazt;kEk`NlR;SL7aXMk|h&H z+9T#NF`>gDAD1b6ghH3Acce1^4WR+pJ2U=y^9!D~{{q5j{4NaD8UGKEJGsIr4rOhy zyZb%zVGh1fH<8}wpHJ81>WGA40$`%7#;wP!C>vF0y;V_NT>Cq8&Tce0jbR*q4$q@R z3900 zn=Yk-YomHco`O#h7>_WDWiyT%RUJkatwqZAKECc)e1iLHhVlh3KUdwlm4EKo{>Hmx zd3r{}`;du^Aj8gogpOhFaWoahFUbB!2v`Wi{b%`+20cAd= z^%eJIn^~JbkYC^9YlSEWLhkuCSSxtyVza~mOxWL!YYVy>WFc3)SCHRO&+vR6XM~bj zqTmP_tp7)rlrN=d?oV@ixP`!LUuPxKKc1dj5|KYiz8hb2(1CIxn{ zmP~d9>hC~MCZ@YxV!}U&6Ha&yUxZrBINC9!2mX%s59A--4JmMb7qjL`NKahqi%IQ? zR&3$?i(nT~%{S@I=G~hvucRZxEUGK}Uq5;vr&%UDy#O6MKxtGGt8Ahc zF(hVZzAl;K#{QR`idtNLSUL<$>2Q?65cRqk1A-|G&B&LM$t#A^I!ZGq^DOS@SpcW( z;>ABgkWgA-WeRRHpau{Y7K~-crj+Y9F&b*Z3^m(Uci3o+ur+0S0k6BaSN9ny z9|K5)I3mp{Eq1R12iMBX)x|Z#T1s0-)6ukK(S~NJBUh*k$g(ZIn0HhRe6dk^-u>9X z#C@zEk*A|P#*_Q&VyqtmNn@L*9}_J}bHyxrnf&oJB0;(IB}^g=zUf9XpW?6RJ{&%u zSVicQL(|U5ou*0Ylz%?w{wO+DS}gsbaJbbjIb0^vjFLH-ATk_sD0ms)Y{Z)5=VMs- z$RH&F<){qrOw%k3dr1sKUyakr0!uMNKsDPiaYcAN62c)f5qwFr`9qdW_$5$U#~A!E zeX6taXDnCK?T=Mddcjx*XZvBV9kg0iP_T=Y52cnnbv#Xs(wrtymE)`Ez5T_Ti!IccS0dc}oMn-6pvde+V5ND9k(q;zPi;OVflDuJ581Z75{ie&c-Mv8Ag_V9ZHJY~r;^-XV6o874X@%OMRvFUs%8 z$=yD71T+3BIiS4DDngU$CyQMCnDX6cL%XUrp+O;>4Y5!tLLD-5f^MBI!0eCA6J>=; z9Y3seH$~rsK%3)>p~wRwlTK;4PfP$5%J1CBGC|UzrYHbdiM?DI&w@(kypWvyM6NK| zP&XHgHF^_GIB^;+b~{>|XhhhQK{LGWm@u8fPsX_V^mYzHGv5;&Mt1a)qV;juEM65V zLjMukO1{fenMmlBaHFH)O9e~_U`|TXu(s%hPNeJufK7ZZLiFW6wWPRff*L-8x$))x z0s8uyMEmkv4faPM*IsPZbC?>dg0my>AQ+xuPLB~>r7IkokCn|{CTMWetm(UWe4Luf ze~b7CNR=^h7;y4&(~wh8@a&OKc0WNaz4FmdhL{_+-d53L&zwvChI(;8psssB6eUR? zWetblB2U*6HfPaaZbtle9cYd!^)gh;d3+Qe$x)%N`wjKRhZs+HTri+AWQ$Iyf% zBzR!T5;0b&GlkIB#0Ub>nDM3k`LpyL={TU&jTy;~R#H>cV(K0y0hn5Mazz@6og1oz z4~q?X5%~>GC#)=@Q>A3!!4KxK2TaU5w8-HMRf&sHhK`E?u*AW9%o@fg<#YJ)Vfb19 z*|6><-x*6!VmIQput`q*1TaY8alE5KKV+F`#IPDfKr3w`)D&Z}sZ8e^=*A80U{eGo zGO!iMyw0M7K(xr~7b+GVqm{KsA%c#)kjZ`=fnz2h7177zhbwwoCgt3xJt#EjPhr=f<0 zEt8_C^$0H}(zUN32_e&BSq(fb2LTWl>;MEy3ntnM$6A?6Wfx_l8{IM%fi{*A3@n8eLr%j!xi>@A4#v?M z#O$JB)~KBz#!6)42jm?n2 z)si6?rx*Y4v+6S`u^o}^+JYzzx!ueQdEY_iq6?2kqo&}uXqxdjM8 z3lgyp9B~ODc?&Ax$Jo4|hd?p3i*1g65dtt~A~{0aSlV z3H}k9OTPP~F^Rp-dCM@;lL~X>fTJx-q0+Jz+lss!ipLV0NhE`w=i5`b#-9uB%@rWb z<+IEsL&$9bV*`#r2@_)G3;IIO(@_z4o^g1`nqUh%=BSf7>vMFRFTM#c=Xj&7yT8z_ z#~YQ#i#LAwx~irmm>~Ri#d?M-Hs2QY{oQ22w$cmv78vALP`&3OdFXQ1qi++`lL^LP z`%js|P%_P|iad5R*8;Odt`j`11s;nvg{t%ZU><-R8gT1H;tt1UUk%Z@{5M5EKBqe!$vj92G7 zL$ALKI&zmREfl4-^I{i-&_nIXNQKuv!()6(xKyV#@aENFEyZe4Lc*ZFsVyY}tKv&p zdPeJ3>3tJ1R|iw=xl__;tGRmj6FU#h<&m&h4b9~1y#6@RR2Fr|v`Yvbjuf~q|>+_&*b4Zk~m z5mVk6CpJ^6mdW$dAwD@pd9)f+lQs%(bd1k53{N!#=<|vdB`R^v)tn(_T?PS9pU7pZM!B}V!4Kp;r)gcH_l^AU@0 zW_JH=`^BR@BZ%c~SLE{C=N$rpD(6aYHR8#!a>2k&!Kj8Vy+iY}m&J6ixqcvOshyYHsscJ0^A}0D zxE%J}7(%8zFZBYhd)Ig-ZMd`FYcZ_gIYkQ07Y_`P+LZZcqrc7HR6bXV#=%GL>Z*)? z>fno-F*)M*D+*57OPguBJE)6=hfOEUCvBZ+`rX8v!G6J!DMKIi;{LlvW$TsZAECPN zdkqUEO;xVj|K=3%XkEE4S^_8jONdV>LiG6ByA>B;Gd!*Au`TFqC9n%{al^h{F_qC} zu}3Sgi;h6u0O%q!-->ja%;$fgcyEJ^nIwF^u3tpkhN_t>fj27KhSW*}jLI~U45OW& zER;VRqF#2a7DUlYqbtGrqKY&#q*m%FL^gD!5^t5GqRR;8*rS*`D8C7xn0w&-*ik>0 zL?cT7ZKA+LNMXD}AGA>R(`%e{YNVCZSAP?-u3A0zDS8`Ni($Un87UbGk554<4?Wgy z{D%Kx3-309(*ypx+epH?M*l(WbrYweoIc^6>1LT;5IN`rSM={wj}+5F(XyV`wye%b#Ef*ikX6UlCP#jqu-LqX~ zX7I7%tL5tnAVvu} zv#@U=So{`U*rB?a2wzn{rWMzF3WEbonXce;5?wbZtpiY8=A|? z1eLG~ytkZiof9hk?llVQ8*|9-XSVmW^B4epei5m$efbpl1jPcQr2m_v*q4wvjV+0{ zG&x9RCO{N8gR;sO}^Eo8kVC&@3E3 zGgLFW97YDfiUo|JLUP<3?D9=A-Q%02Ai?Gxr$M>kv)MN<((VnywC`hIuVF@TY|RAU?&QnZfTwV5b=s(Na(rI@D0H$~ZBG>Z@LjXW zx&SMqZflc94YORx_jt$BeG(-9%94L6_IgTR`&pY*6si*-R(~aj+(ivqU!RToZ}Q|R zHfadmj_U9O-yCUkth;4xRv!Wj#1CVGa^ z0qjbHs|FpHD#g>APL>U<960bIOlt(>Wl?caxrxNYoTVcjn9)1S6}I`p#`BcnU2lzX zl&kmu_#IBpjWwztMbaR~JJng7<0x_eYGKNiNnNCCU?WBj6I%3rWO2Sx)m8HB4`8^s zbCFh8dnfb#^%>i!so2GDyv(WDgORWfN+xz_LQ!6=g|hNd?r(M(QiQyZhy^>9Nn6g| zizm}cydCmNdi-jvZH0>6>hAEC8yV3PjaG6FsoeW+X@a0md-J!fU6 z*}{Zs^~HQc0R~GG4t_so5@&QW6eQF$of?g?2B{VisEkonkodQf zYH5f2ACNzrwvh9udf389`toHsf%Sx*l!m2|zb_0P#GC%aqr+Lvw!2Z%Y9{az<`1eW zrS5gGDN1#Y<`z>HJ%m)m9J_<{^-Ts>dn*diQ0te*ABc&bPGP=7o9U@3c?>C?8 zdA`?g|82W=EnYkK=f2N5@AKyV?3NtCg5RVb1Al-;Z^9g3jdZqe@!jnz2T( zU+ehnNuBw3G1h!F(#TFVR{K{AKCWr=W|ChssRllBV!!B|%ifc4*Z9mx(11J%H&?X1 zHGrdW0x-%dKAcdhu2h4kae?z|FF!M`uPomlJIA)JpExdeGdNXIEZ$7IUYWVLfI|`6x}PuIu=4))nDL_^_N>H?%O?5LQD;u@ACqFb}G5#kY9BW{b#qm8VUmO zsj2)DCS-$)uAzsbkSnB8;zC#9?IG4yZY;pODWZ=H%@UHUFVD54MvZzNa-a4}c_bQL z?>t{T@pDO1R|YW&tNvPnnDMK?vGMf-t)};gqlT`NbJDw7laq>l_o5kPtzh%?bO%jY z9(xHPu}vZm^{<&szXZo{L-PuZ~|a6C(z_=aBI5;Fa?$cafKSqtB5R z8^0b`sv3DCT@Z`qJ?mAJD4_sqFW5&$iL~EWKdr&OyRIu^a;Md)VAP;cjB8#grDf1C zGiq^^B?cf^zh&;7|N2^vGpBcIBo za~_+QD$QK{wVD^fT>j20fJPu`^zNsbSPIM1saaP?^LGXUfv$mz>q)6|sAoSobkqvZ znQhwf)9hfzH;EGNH+m>dRw8P0DlW$-#ZXY8 zxzZP0dRd+g6M}y+)Ir5S76k`7NPmVFK>)?t`4D}uUYcd}wLWIwS1;kTO<#DRmV8LW z$OF!{H7uTJ6KYsGxK)To3fjp1i6;_`{l=*8iqepKK9cAOPf6dsBO2C3C$A=dz^8>b z{1gI}?VGs{1=FpZqYg_`7XBAbd78aW92+tg^jhP6pUR?`boo8c4HTM&XR??iZft{C zq?PV&s$#kSh-5a{$i;nRwO%y2T^zo0tz)^G+<2q#c=KBQcHw&HNg^6h!47zW(p2%m z_7pu?-AT=vDS&}6PG5m;PDA#Y7tAJYyoi987y2`ZqeK>1CLhyy8#$#hXFsR%eer4O zSN^-;_j3hd(te*8+9cmnVov374~Gl*=ioBjv++LXw4l5tI&4pZX8~X^fPxCZl#@ie zxU#oCu?dfCwDoC3LA6bZziH2l(#BMcm=hVodlzV@ApEG4CVFG&?^;q2IV6l&>H)-+ z5Cb1s-1Y-#^K3VQ7S}{Tm5g3nOc3WSHenXQ7kL;YT1>!82Ug?)*be;XIt0h~U_Vr5 zzX90o1yl|;1GF5{PdoAeYy*Z8BZdNiOg6*biz(KS?UVDo{n<@x;)pfD`_r%GteW57 zlRCeP8(Q7ttGTzFXG<(2cn~D1vGH=AaMv|1%I{BUQQocO57$^nP9}SyTY2>I`0x4e zH{FP{920jop=w?0I+fom-LDOy-_!-B+%-er>EZwW{@32E3Kh9*6CkFpi$UWRBGOn) z(c*hhjjWKuqQK2@%bwSLGIKSk#)GMtY^e^2bq^QtR6kBJ^{Y&n9rb`eL)1+!6eFht zJ*I+*HrJpm=9mrCfp46-+xg_zq~6)H6REn@U4$e8@oUcHs~lJ65yQOLnEBnc&)*+g zFBld+{=TPk__+R?G(%DJ>UlBAPmI_;y`J&qGXL@ICFcH=}_mwKz*x|(E>Z?96N%fBT?Z}JAp5lj%{%-zX z+ndhCY@<`LtOD-20=afxP@CxiNHHrqraWM?95_)!50wEA*fn9rYJe#PV4|ap0z@gA z0tInpe%FO04mH!1k?Nu>3q-LcX$J;Y%INCPz2V>kA~}QG_}Z80X=SsAlU2%eZ!%OT zGY%&%ltf)cYd$n*k3Ab7RU_%rh>tX5h?94si|St=uzOw9VoR4nt7D1FeO#r)NUy0l zc^CYUS4gPF!s_M_dPEtTFeyK!ro@)*Zr59Mtw_nA6HkU@^V96d8f{o>A7iR@zpe$bW=563ZMkmC?H7 zy*a|fT2Xe4iSon*J)E(6CkgC9xU5#s$4Sj;*(9+?WdOeIQ6ltAfK)IMSCO`e8<5m~ zV{&K^6Mdy2A$%G)Xnwuws5O3|eEpgyX7oFV_RqjZCX@4asBtq7P}j6tLuf}o%b&8) zLb=}_ip9rzy%HKr#-~INU2>;Knvp!{a$CJde`=-HW`7crZcb390|-}ZY76{9jww6j19K}WDJ#Gr%#BSoOX z^m$4G)`H6yG($$lkg_iy2|fX80i>l)+0gA zdgiPpKS`r6`omRZp0KSThRa+6XH>y#7XGq*&bL~SDj!BUoDdKLKWVo+jlj8lZQ93C zhaZdbFj87^W?F$HW@;JkzPMC=SzsGP~eHJH2^Pa)&&e^%ZborxVbkx`_5e2J|%SVMY z*#QoXSZr4MZauEZ_7#;)mn7MNl$Yu$OSD@aKJ}hT+Ekb{Kq3X|Qn+Tht+6cIH3Gr) zXB{zkdk6vm)Of`SkTld7zyb^W0c0WUs3|~L2$l|3HBV;Sl)DY=A0cAYi(wJ9u58sa zC|Xtl8m2j+=U)kpdSh5ME@Ln7XPgE@2uS}>&Xp{b621fafRE_+7Dx$Q35wHgSna6PVFz?(!gilbR8oE4Zm{9hf z*B*ITCj3FC`cu^#N9Pvq=f1 z19P75E$-s_o@(;0HgJ+qk)Rfi(b~Wn!<|2eXrZRDcn{i-rc;32iSrUSx-$9j#V_cOuzqOhd+yzoLP;^%f*iUM~DmnF+ZD{(;|bi zK`1{0%qV#BmpU~p?%HW^q<;(m6mwQv$Q9_9E*n3Q8`TuR*&JQkUhq?@b(g3B&z%-K zi%`*8@$EcV9ZG|deOmB^(MFGBD#f=^jAryySb;RpNh!T}Ap+-3brPJok+C)L28^fM z1x$@<0c)rG6BD7RXfdRE3U1DunYcZ%IzR6uJh8jzHLh;GB1!L553iu=6d_EhLO3@2A^k;ZDlaL}i?2 zn!mgX&f{cxkKf<)^SGojJfl3|YHey6`}@;_b;02lKW85UO__y%ghWs;cx7hvv`nu4 zn^VA#?vSd5j`#jIFNbe}`19;XbPjuQBBEzD_+i9W^N1Mt?><152IPH5nX@wq5y7f# zW3oyv4`gKS9XSnWNl#vDYmon>;mk2jhT4bpy72P-G99j4quqbe=3Qv#868xYN!ln2 zw-Zd^-p}&Y8d*C&m;S?9LQ5-1BTgrOO;c!^qmd}_oxN#u3=^p7G1pYC=Igh|c@L>% zu|vhyU4zTU{}d-JOXiZ?cE)iqtf0^>XQX$&eo^aOI2@Pl`bPenqls2sVpP)3y9hK2 zZMJv6f61A+kh5037h=6(-qq;UKEke8uo#r!MAk5~(>?nUIuO zTGYv@WC;{;nyc+MpE@}jhmmA zzg77+5tuw%J$FARPSJmT=Bnz24nIG`spGp+rBGhJ{3h_xn0 zi=)#S31sD`;B$euP!HqtfXV9QXC6-7z!4a7V@-SXvt^?E-sWuN{G$9gQdmHph5Gs9 zVx}ChOEZ;bIzdZ)n&8XiZvF`w#h^nwg-C9HlIC$wJL#m$?V0`*=nvK08TgP|(q}&T zLG1qDGpuf2EX90cVm##RyHz5@#P3k6MN68qce6M@c_|)#!P?|{6#QY(HMjJPf_4Lx z^_?v=E4Xra?(Zdi?ws0e-Y*}-!+=To?MwXe=B}?|GhXc(-qnvS;`*k@_a}y@$Lp~y z@lS@uIE(se78_FW1j>G8&i-@lOlW(*Cc5aVs;2;PCb3udU4d8^j*q9sS})a+*ytv+ zqNVv}l%rgY)!K>E#xunTdev8M&@`l}ITiO;?Jhkv&if*UDg*n7BS^8d_vt29M7ZK4 z+e}>LtjS7seyk5w(c@o3BhooVm`Bg~fTrZXgb1#?rOWHTf&Uvr*H>4#OktS7cE(~e zs;GE}TaxF*SOVewL{kYEq%!G|F~jTFFyuQi#4u4=JV2ZRUnJt1$gG zQq|ml95CL9MRB#AFcFM;c||8l&es z{o@Caca+i&HjNQ?P%S`&bDDG`> zv`U{F`bk;(%gG!hJR$*JZAQA7OYS`Zlnt$Sifyr126FRZ*y)X^3EB&PB3Mn-p* zs|;I3+9`?h>8c$z?S}Qau+xsHZ+Wa9EcyiuIA0gmOed1iQBaH4jxkupP%Fk;<)t=m z`4^=t4E+lsMA*d#Sq(DA{>N4NN_qQ7%8~~I}5Xd6V@v){4~>Be=SFf5&7gD z_={Csry@gsI~9RUc*jTO4V!c4=-+Y}8|iEY+Rw3hl?+;+Yv8t7D=eA?WClgvVBQD0 zBf1{VT!QPiUp5wZ*+iSnIRT(d_9@@Og?!3Q)YjbrOMIO(|N3Lq&e$L&Ii<>E z+`*71x)Ye^uquWMX=|n=WZOQe0L!G`ss5I`_9~12OjYhBaALQ=yILLnlwALLd10kZ zn(mxx-Q?e~$&zy>2Mbxvie)4x8WT>V?CtKY%^67>x@ecgGMTUQpM#6PhOMboLcA!z z`td(Eq^&Qp8gQMsxiFk$Q2+L`jY8C4;Y?1Yl4~oUNF3?qQ(K6E?>`+EwN!Lft5UJi zL6oD?Dg6HtIzt7iN=#ZGhya|uORqprF^DG4`5a4DRM62N^S$+yx<2^u?Zo{(MftSB z?9x(ygvR!M$%P8&5R0zU4Qv1-|@`=lV55ia2kXTwu#vNbKckK(sv1;82)NX2?G5CT5@O`C z!kuj^l#!|42_Z{7mDbtEi<+40)EbO*D|hXv7yzLL&YY@5Ay4thLAq^8=M&Si%jppp zTTeccmCpB(^@Yh_j&29mrHklS{^ZK*mYc_2X5&t>D)2<<2Pmkl8}ZgO1f}UXx;W9o zmIf8k7}}2h5jw#DVHv9bGw>4c6@^+M(=Bg0grZ6UVZ*@BKX5p}jjt^<`|Ru)-`(Pa zw~E*1+}SBtjsFJlprEzQC4ZMurJRGRvaX`Sl2Nk|2uQ(sQwaFA&w?lEzda zwd^kKUOvj=Z1ZG=rz-Mol{Y&%P9VgGM0(g2C}S{wZac@=JXwFNt15iPXnc9y-t?{S>v=osN1P|l%cpBX4d-O9LcQCHsdC~Xe_ zEEQV&5K;k37ZgfeUO)kj zNbOvO2v?s|kWHO1lW)uJPni!DD87uDzrAMkOTCrkPy`w;J}v|*faNv>@!l7l)>aO9 zGxiOR`j5~Js=W16_3s3N{ji?_3U(YIf{AL07G&ad4Ska>KM5dY7lLpw>Fz^G;}R7d z2C7EF7aSI{p>)8gLMpde0zY-=^7ls@pi4wOy86dJY+=%-Y}-eL(3iF^2G#sMGp5EW z^AFr2-D^L4sl18I@vb2dvSDSbv;|)-vvdkgh>VVtOUMPA@A*fd=Z|v+Nd?4DvRtx# zPCaij!ifmkjJ-Hc@`(_ zkDQe70-^PAD~-4^dqg(4t3r|i<%W6`uLl8`0=fi9P6>lA<^>-!x_=(ZJBUqpsbyo04i2Yv(T?aZVK0HX@!)Ua)GV2*i0OYSKhb6U<$?KZ( zx~DRZ#xU1cR)djm=i@Sd%U#O0HAO0g83CnblZmBU#ynXAeEz0AH&QB2!aO%h5|o=4 zeBnyyq?sT^dJOb1Xb~1)m})i|bnlyWiot4r;P2)uGJB>UNdLQo^1G*ph;qbS4W>NE zK-4)hi8Eu9I1CMhMGdtopzws;KxGuPu?TPVi13JGhe6OuHoSoajHxV6<{%RBWhYfKg023uUlk-Haf))iaBc92tnA~}=!W;~`YZ+p1XmB&9K)@VSs7Rx7gdFhk%a!Fcb*F~}5Oe{6dsy6*I zR&y1fRkdK2Pxa?(A6UOh%=t6__UAd1@>#<^|J3}K>r52@hSPBMC96DlM@~Ka3T^)p zn!pF$3QVNFvg>7qW8NVX5yXE4MBVF+z%_7sDDo<((^#z2CG3gzv;_@2tOfwA3L#dF zLfOV((fDtJs8JZx)b1gUS0EoQt4-Os2vii|cyMS)1Zk>FDxLBip{Bw&QG>y+2?7fz zxT4;}UWl?RNA;h^`9q(+J2cuHu$R`lyEKq8*{Bj0G+xosr@-_YOn(dEI0VYT4UEN( z#2;3xC>odM_P{Gl>VAI1!#t|N-0UdY^=#HG&0#nLieMx4UKR0SAd z6po*8ub0qYb2wQ|HquCwKugLjDhC=&8pCVF2BGhRAg%i~(X%GyAg6g%3&uVP&Dr+X z-v;=w5})+vb(WOW?tJb2zTi(5bzoU%PcfzixTHuU@o?-H`|39GDcE;01l>;*A9sX} zH5~mKYKbn3R30LEniZX8C6}DjA6ZD2N+shx=UV&q6Qe+ZI<_>lLc4|=4>JS>2A`hs z97HDpk~P4Z{Kc>X+hVnPb!|NUQ}baaTOuqh(8fkqE6RH##{w*vBx4^P&D9N`g9UAD z|H?ghw-4KGK8-P_Im!^FYAL5n14EdGFP{x#^N+#gE4g|%!3k<1h@pQ%v3zxHaUvIo zq}w~RA~fi^;ESNK-*(+E5T_hT!K?X1s210Zw4;iw+!_FoE7J+TcL|xS`ti)mL2P-x@IiZZzRC>Wwl9)XN=;%DX_|CsUQGREj!Nl)C65wm#_iwr zT}G*$f3!(QpEdAuZQ2o3D(HI2p+l^p4Fy)HOx*P#3jYUf04>@R^m&sR%?gE%kC9Oj zLLwLeJ@B!m7f#j#m}DBqS@f>WLvP~W5yJUpLK&zRBR3gSikz3y)PW@X5x203OP2J* zgbFO^OCi>x=yp9q5IRq3#@DfuUn`L1q9$J>FYo6fGTk~#2SRbj)UUJCaW7xlY1%NO z_tdkD7|Yt|JA*qmH62Yln^@J24-p?$Ob!vr->cdumX)rkFG4K#0N!dDFcz zkmi{sYeiC67UH1AO-c5gn@N}oJZ_|iM>jF8NN=45HZ*A#28E%bve5&SkkBmaTUwC&y3pN_ z4vVCsq_kr)gtI-*D#*9vzX{QdG*6;jdg)=skr`<W|38QazsXPs^P zdNjK$cjDWr!IZWc%JOByYseUv)bb(on>qm45m9c&gl**Tp@d^Z|A=SJodDr~HlN)1 zy6+iRF%;VW6Z^P>e1+878ek%{PL3xCRY?dg86=K(njaa7K>fz7D#al*2H$2Ym`U-L z>-tE1Y&aD7g(~ogV0J}wX7WEm`-zwH>Z5Tvw447WM4tYXoma9Ad6*M~BQq}LLgUqr zZ$cm=^e{wyK-}uYH1Vj6-Nw6sG(koy-x;=*db?tfOy8v?t!ANGA5B8vj4p4poyn0Y zwxsN-xMo=YPL*-5`LN*djjU1lZ!I6yjd=?}JG4@;b~J04M_x;0m&q74U4;p?3hTBp zoU2up5=za7EA5MW_GOn644uX#e`~?kYOZi7X}~!gMnav`xXtY7KAG56BQxY}onwNI z@B6eV`F71?WP6r^!^-w!n5q2?mN2Q=Lhy4vp4^K1__!+FCrMaf*@ieU`~1Ll*@A63 zo5g2SDrEc0L}2#Ilg}zBv31o@kYF#9?lZgIH*!r3FTXQP{K%gf`afOd|7E;@KDZAn z(ZriEeq%!9iq$9+f$qQuOMs(R4&b6Qg$xXk#DLAir%~Z6gkYBKEW4L1+WbG`2iU!~ z7%kyW>cq1<%CSjsCN_8!VM?l#K5dPK5RoJU@fzPc9Ms<=7LF$PfoF%0N^Wp8mKGTfC->8 zS+d`YgP1Y(?RTE8Gzeyp)_P@Lf^}~!`(9R$-b{vT88F|>Qqp5hg;Idgep%nl0`GOKpGB>wIuPOVaZ^@hRC=jU3s>^Y+Pe`@J5I_!{27R3rv-29nf$ z#r?5k(r$PVUvXycpx``y3&8JxgaB-0Dd*)rth^&z%Ct1*>NTV{N?NLs#z&&+LeKC!llrfBN142WF9ei1=tdF6_pL%0Rjpx$(;gP!W)~*h5hqi5USYO~) z96lTXRCmS}Y?9TmlGGAXLfKO2q*~!AFox?iL^^5*jmjmhpkmpRA7*7D-g)`7^uCQ! zo%ac@oae31$N(=xiMS757rRDM

R(3l1X6GL4Yv=!Vqzz6hLnm`a|cYaJYoO5UCU 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 z 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%0Dcd3i?PdM~L-~1{upKD&$_kx4nS`HjGa!M4W^n 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�K-$$Kh&3=MwR{GJN?0Mktzh_xii_FBS5G{lcT$ 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
%v4n!xet`0$_Rqql0AURjhez;-fW|B(8zZ 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 L|6lw+eu4i3Zf2`w diff --git a/deepgram-rust-sdk/examples/prerecorded_from_file/main.rs b/deepgram-rust-sdk/examples/prerecorded_from_file/main.rs deleted file mode 100644 index c80872c..0000000 --- a/deepgram-rust-sdk/examples/prerecorded_from_file/main.rs +++ /dev/null @@ -1,39 +0,0 @@ -use std::env; - -use deepgram::{ - transcription::prerecorded::{ - audio_source::AudioSource, - options::{Language, Options}, - }, - Deepgram, DeepgramError, -}; -use tokio::fs::File; - -static PATH_TO_FILE: &str = "examples/prerecorded_from_file/Bueller-Life-moves-pretty-fast.mp3"; - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let deepgram_api_key = - env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - - let dg_client = Deepgram::new(&deepgram_api_key); - - let file = File::open(PATH_TO_FILE).await.unwrap(); - - let source = AudioSource::from_buffer_with_mime_type(file, "audio/mpeg3"); - - let options = Options::builder() - .punctuate(true) - .language(Language::en_US) - .build(); - - let response = dg_client - .transcription() - .prerecorded(source, &options) - .await?; - - let transcript = &response.results.channels[0].alternatives[0].transcript; - println!("{}", transcript); - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/prerecorded_from_url.rs b/deepgram-rust-sdk/examples/prerecorded_from_url.rs deleted file mode 100644 index d7de33e..0000000 --- a/deepgram-rust-sdk/examples/prerecorded_from_url.rs +++ /dev/null @@ -1,36 +0,0 @@ -use std::env; - -use deepgram::{ - transcription::prerecorded::{ - audio_source::AudioSource, - options::{Language, Options}, - }, - Deepgram, DeepgramError, -}; - -static AUDIO_URL: &str = "https://static.deepgram.com/examples/Bueller-Life-moves-pretty-fast.wav"; - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let deepgram_api_key = - env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - - let dg_client = Deepgram::new(&deepgram_api_key); - - let source = AudioSource::from_url(AUDIO_URL); - - let options = Options::builder() - .punctuate(true) - .language(Language::en_US) - .build(); - - let response = dg_client - .transcription() - .prerecorded(source, &options) - .await?; - - let transcript = &response.results.channels[0].alternatives[0].transcript; - println!("{}", transcript); - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/projects.rs b/deepgram-rust-sdk/examples/projects.rs deleted file mode 100644 index bd0c784..0000000 --- a/deepgram-rust-sdk/examples/projects.rs +++ /dev/null @@ -1,32 +0,0 @@ -use std::env; - -use deepgram::{projects::options::Options, Deepgram, DeepgramError}; - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let deepgram_api_key = - env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - - let project_id = - env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - - let dg_client = Deepgram::new(&deepgram_api_key); - - let projects = dg_client.projects().list().await?; - println!("{:#?}", projects); - - let project = dg_client.projects().get(&project_id).await?; - println!("{:#?}", project); - - let options = Options::builder() - .name("The Transcribinator") - .company("Doofenshmirtz Evil Incorporated") - .build(); - let message = dg_client.projects().update(&project_id, &options).await?; - println!("{}", message.message); - - let message = dg_client.projects().delete(&project_id).await?; - println!("{}", message.message); - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/scopes.rs b/deepgram-rust-sdk/examples/scopes.rs deleted file mode 100644 index 3d376b4..0000000 --- a/deepgram-rust-sdk/examples/scopes.rs +++ /dev/null @@ -1,31 +0,0 @@ -use std::env; - -use deepgram::{Deepgram, DeepgramError}; - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let deepgram_api_key = - env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - - let project_id = - env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - - let member_id = - env::var("DEEPGRAM_MEMBER_ID").expect("DEEPGRAM_MEMBER_ID environmental variable"); - - let dg_client = Deepgram::new(&deepgram_api_key); - - let scopes = dg_client - .scopes() - .get_scope(&project_id, &member_id) - .await?; - println!("{:#?}", scopes); - - let message = dg_client - .scopes() - .update_scope(&project_id, &member_id, "member") - .await?; - println!("{}", message.message); - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/simple_stream.rs b/deepgram-rust-sdk/examples/simple_stream.rs deleted file mode 100644 index 424dc7a..0000000 --- a/deepgram-rust-sdk/examples/simple_stream.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::env; -use std::time::Duration; - -use futures::stream::StreamExt; - -use deepgram::{Deepgram, DeepgramError}; - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let dg = Deepgram::new(env::var("DEEPGRAM_API_KEY").unwrap()); - - let mut results = dg - .transcription() - .stream_request() - .file( - env::var("FILENAME").unwrap(), - 3174, - Duration::from_millis(16), - ) - .await? - .start() - .await?; - - while let Some(result) = results.next().await { - println!("got: {:?}", result); - } - - Ok(()) -} diff --git a/deepgram-rust-sdk/examples/usage.rs b/deepgram-rust-sdk/examples/usage.rs deleted file mode 100644 index 8f20891..0000000 --- a/deepgram-rust-sdk/examples/usage.rs +++ /dev/null @@ -1,43 +0,0 @@ -use std::env; - -use deepgram::{ - usage::{get_fields_options, get_usage_options, list_requests_options}, - Deepgram, DeepgramError, -}; - -#[tokio::main] -async fn main() -> Result<(), DeepgramError> { - let deepgram_api_key = - env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - - let project_id = - env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - - let request_id = - env::var("DEEPGRAM_REQUEST_ID").expect("DEEPGRAM_REQUEST_ID environmental variable"); - - let dg_client = Deepgram::new(&deepgram_api_key); - - let options = list_requests_options::Options::builder().build(); - let requests = dg_client - .usage() - .list_requests(&project_id, &options) - .await?; - println!("{:#?}", requests); - - let request = dg_client - .usage() - .get_request(&project_id, &request_id) - .await?; - println!("{:#?}", request); - - let options = get_usage_options::Options::builder().build(); - let summary = dg_client.usage().get_usage(&project_id, &options).await?; - println!("{:#?}", summary); - - let options = get_fields_options::Options::builder().build(); - let summary = dg_client.usage().get_fields(&project_id, &options).await?; - println!("{:#?}", summary); - - Ok(()) -} diff --git a/deepgram-rust-sdk/rustfmt.toml b/deepgram-rust-sdk/rustfmt.toml deleted file mode 100644 index 8b13789..0000000 --- a/deepgram-rust-sdk/rustfmt.toml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/deepgram-rust-sdk/src/billing.rs b/deepgram-rust-sdk/src/billing.rs deleted file mode 100644 index a3d775d..0000000 --- a/deepgram-rust-sdk/src/billing.rs +++ /dev/null @@ -1,135 +0,0 @@ -//! Get the outstanding balances for a Deepgram Project. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#billing - -use crate::{send_and_translate_response, Deepgram}; - -pub mod response; - -use response::{Balance, Balances}; - -/// Get the outstanding balances for a Deepgram Project. -/// -/// Constructed using [`Deepgram::billing`]. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#billing -#[derive(Debug, Clone)] -pub struct Billing<'a>(&'a Deepgram); - -impl Deepgram { - /// Construct a new [`Billing`] from a [`Deepgram`]. - pub fn billing(&self) -> Billing<'_> { - self.into() - } -} - -impl<'a> From<&'a Deepgram> for Billing<'a> { - /// Construct a new [`Billing`] from a [`Deepgram`]. - fn from(deepgram: &'a Deepgram) -> Self { - Self(deepgram) - } -} - -impl Billing<'_> { - /// Get the outstanding balances for the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#billing-all - /// - /// # Examples - /// - /// ```no_run - /// # use deepgram::{Deepgram, DeepgramError}; - /// # use std::env; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let balances = dg_client - /// .billing() - /// .list_balance(&project_id) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn list_balance(&self, project_id: &str) -> crate::Result { - let url = format!( - "https://api.deepgram.com/v1/projects/{}/balances", - project_id, - ); - - send_and_translate_response(self.0.client.get(url)).await - } - - /// Get the details of a specific balance. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#billing-get - /// - /// # Examples - /// - /// ```no_run - /// # use deepgram::{Deepgram, DeepgramError}; - /// # use std::env; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// # let balance_id = - /// # env::var("DEEPGRAM_BALANCE_ID").expect("DEEPGRAM_BALANCE_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let balance = dg_client - /// .billing() - /// .get_balance(&project_id, &balance_id) - /// .await?; - /// - /// assert_eq!(balance_id, balance.balance_id.to_string()); - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn get_balance(&self, project_id: &str, balance_id: &str) -> crate::Result { - let url = format!( - "https://api.deepgram.com/v1/projects/{}/balances/{}", - project_id, balance_id, - ); - - send_and_translate_response(self.0.client.get(url)).await - } -} - -#[cfg(test)] -mod tests { - use super::{response::BillingUnits, *}; - - #[test] - fn test() { - assert_eq!( - serde_json::from_str::( - "{\"balance_id\":\"a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8\",\"amount\":1,\"units\":\"usd\",\"purchase_order_id\":\"a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8\"}", - ).unwrap().units, - BillingUnits::Usd - ); - } -} diff --git a/deepgram-rust-sdk/src/billing/response.rs b/deepgram-rust-sdk/src/billing/response.rs deleted file mode 100644 index 3068c6e..0000000 --- a/deepgram-rust-sdk/src/billing/response.rs +++ /dev/null @@ -1,55 +0,0 @@ -//! Deepgram billing API response types. - -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -/// The balances for a Deepgram Project. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#billing -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Balances { - #[allow(missing_docs)] - pub balances: Vec, -} - -/// Information about a specific balance. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#billing -#[allow(missing_docs)] // Struct fields are documented in the API reference -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Balance { - #[allow(missing_docs)] - pub balance_id: Uuid, - - #[allow(missing_docs)] - pub amount: f64, - - #[allow(missing_docs)] - pub units: BillingUnits, - - #[allow(missing_docs)] - pub purchase_order_id: Uuid, -} - -/// Units for the [`Balance::amount`] field. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#billing -#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, Serialize, Deserialize)] -#[non_exhaustive] -pub enum BillingUnits { - #[allow(missing_docs)] - #[serde(rename = "usd")] - Usd, - - #[allow(missing_docs)] - #[serde(rename = "hour")] - Hour, -} diff --git a/deepgram-rust-sdk/src/invitations.rs b/deepgram-rust-sdk/src/invitations.rs deleted file mode 100644 index fae53b6..0000000 --- a/deepgram-rust-sdk/src/invitations.rs +++ /dev/null @@ -1,74 +0,0 @@ -//! Manage the invitations to a Deepgram Project. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#invitations - -use crate::{send_and_translate_response, Deepgram}; - -pub mod response; - -use response::Message; - -/// Manage the invitations to a Deepgram Project. -/// -/// Constructed using [`Deepgram::invitations`]. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#invitations -#[derive(Debug, Clone)] -pub struct Invitations<'a>(&'a Deepgram); - -impl Deepgram { - /// Construct a new [`Invitations`] from a [`Deepgram`]. - pub fn invitations(&self) -> Invitations<'_> { - self.into() - } -} - -impl<'a> From<&'a Deepgram> for Invitations<'a> { - /// Construct a new [`Invitations`] from a [`Deepgram`]. - fn from(deepgram: &'a Deepgram) -> Self { - Self(deepgram) - } -} - -impl Invitations<'_> { - /// Remove the authenticated account from the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#invitations - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// dg_client - /// .invitations() - /// .leave_project(&project_id) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn leave_project(&self, project_id: &str) -> crate::Result { - let url = format!("https://api.deepgram.com/v1/projects/{}/leave", project_id,); - - send_and_translate_response(self.0.client.delete(url)).await - } -} diff --git a/deepgram-rust-sdk/src/invitations/response.rs b/deepgram-rust-sdk/src/invitations/response.rs deleted file mode 100644 index 657f8ab..0000000 --- a/deepgram-rust-sdk/src/invitations/response.rs +++ /dev/null @@ -1,15 +0,0 @@ -//! Deepgram invitations API response types. - -use serde::{Deserialize, Serialize}; - -/// Success message. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#invitations -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Message { - #[allow(missing_docs)] - pub message: String, -} diff --git a/deepgram-rust-sdk/src/keys.rs b/deepgram-rust-sdk/src/keys.rs deleted file mode 100644 index 3b76b1c..0000000 --- a/deepgram-rust-sdk/src/keys.rs +++ /dev/null @@ -1,205 +0,0 @@ -//! Manage the keys for a Deepgram Project. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#keys - -use crate::{send_and_translate_response, Deepgram}; - -pub mod options; -pub mod response; - -use options::{Options, SerializableOptions}; -use response::{MemberAndApiKey, MembersAndApiKeys, Message, NewApiKey}; - -/// Manage the keys for a Deepgram Project. -/// -/// Constructed using [`Deepgram::keys`]. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#keys -#[derive(Debug, Clone)] -pub struct Keys<'a>(&'a Deepgram); - -impl Deepgram { - /// Construct a new [`Keys`] from a [`Deepgram`]. - pub fn keys(&self) -> Keys<'_> { - self.into() - } -} - -impl<'a> From<&'a Deepgram> for Keys<'a> { - /// Construct a new [`Keys`] from a [`Deepgram`]. - fn from(deepgram: &'a Deepgram) -> Self { - Self(deepgram) - } -} - -impl Keys<'_> { - /// Get keys for the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#keys-get-keys - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{keys::options::Options, Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let keys = dg_client - /// .keys() - /// .list(&project_id) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn list(&self, project_id: &str) -> crate::Result { - let url = format!("https://api.deepgram.com/v1/projects/{}/keys", project_id); - - send_and_translate_response(self.0.client.get(url)).await - } - - /// Get details of the specified key. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#keys-get-key - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{keys::options::Options, Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// # let key_id = env::var("DEEPGRAM_KEY_ID").expect("DEEPGRAM_KEY_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let key = dg_client - /// .keys() - /// .get(&project_id, &key_id) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn get(&self, project_id: &str, key_id: &str) -> crate::Result { - let url = format!( - "https://api.deepgram.com/v1/projects/{}/keys/{}", - project_id, key_id, - ); - - send_and_translate_response(self.0.client.get(url)).await - } - - /// Create a new key in the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#keys-create - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{keys::options::Options, Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// # let key_id = env::var("DEEPGRAM_KEY_ID").expect("DEEPGRAM_KEY_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let options = Options::builder("New Key", ["member"]).build(); - /// let new_key = dg_client - /// .keys() - /// .create(&project_id, &options) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn create(&self, project_id: &str, options: &Options) -> crate::Result { - let url = format!("https://api.deepgram.com/v1/projects/{}/keys", project_id); - let request = self - .0 - .client - .post(url) - .json(&SerializableOptions::from(options)); - - send_and_translate_response(request).await - } - - /// Delete the specified key in the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#keys-delete - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{keys::options::Options, Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// # let key_id = env::var("DEEPGRAM_KEY_ID").expect("DEEPGRAM_KEY_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// dg_client - /// .keys() - /// .delete(&project_id, &key_id) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn delete(&self, project_id: &str, key_id: &str) -> crate::Result { - let url = format!( - "https://api.deepgram.com/v1/projects/{}/keys/{}", - project_id, key_id, - ); - - send_and_translate_response(self.0.client.delete(url)).await - } -} diff --git a/deepgram-rust-sdk/src/keys/options.rs b/deepgram-rust-sdk/src/keys/options.rs deleted file mode 100644 index 9ded59e..0000000 --- a/deepgram-rust-sdk/src/keys/options.rs +++ /dev/null @@ -1,259 +0,0 @@ -//! Set options for [`Keys::create`](super::Keys::create). -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#keys-create - -use serde::Serialize; - -/// Used as a parameter for [`Keys::create`](super::Keys::create). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#keys-create -#[derive(Debug, PartialEq, Clone)] -pub struct Options { - comment: String, - tags: Vec, - scopes: Vec, - expiration: Option, -} - -#[derive(Debug, PartialEq, Clone)] -enum Expiration { - ExpirationDate(String), - TimeToLiveInSeconds(usize), -} - -/// Builds an [`Options`] object using [the Builder pattern][builder]. -/// -/// [builder]: https://rust-unofficial.github.io/patterns/patterns/creational/builder.html -#[derive(Debug, PartialEq, Clone)] -pub struct OptionsBuilder(Options); - -#[derive(Serialize)] -pub(super) struct SerializableOptions<'a> { - comment: &'a String, - - #[serde(skip_serializing_if = "Vec::is_empty")] - tags: &'a Vec, - - scopes: &'a Vec, - - #[serde(skip_serializing_if = "Option::is_none")] - expiration_date: Option<&'a String>, - - #[serde(skip_serializing_if = "Option::is_none")] - time_to_live_in_seconds: Option, -} - -impl Options { - /// Construct a new [`OptionsBuilder`]. - pub fn builder<'a>( - comment: impl Into, - scopes: impl IntoIterator, - ) -> OptionsBuilder { - OptionsBuilder::new(comment, scopes) - } -} - -impl OptionsBuilder { - /// Construct a new [`OptionsBuilder`]. - pub fn new<'a>(comment: impl Into, scopes: impl IntoIterator) -> Self { - Self(Options { - comment: comment.into(), - tags: Vec::new(), - scopes: scopes.into_iter().map(String::from).collect(), - expiration: None, - }) - } - - /// Set the comment. - /// - /// This will overwrite any previously set comment, - /// including the one set in [`OptionsBuilder::new`] for [`Options::builder`]. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::keys::options::Options; - /// # - /// let options1 = Options::builder("Old comment", ["member"]) - /// .comment("New comment") - /// .build(); - /// - /// let options2 = Options::builder("New comment", ["member"]).build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn comment(mut self, comment: impl Into) -> Self { - self.0.comment = comment.into(); - self - } - - /// Set the tags. - /// - /// Calling this when already set will append to the existing tags, not overwrite them. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::keys::options::Options; - /// # - /// let options = Options::builder("New Key", ["member"]) - /// .tag(["Tag 1", "Tag 2"]) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::keys::options::Options; - /// # - /// let options1 = Options::builder("New Key", ["member"]) - /// .tag(["Tag 1"]) - /// .tag(["Tag 2"]) - /// .build(); - /// - /// let options2 = Options::builder("New Key", ["member"]) - /// .tag(["Tag 1", "Tag 2"]) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn tag<'a>(mut self, tags: impl IntoIterator) -> Self { - self.0.tags.extend(tags.into_iter().map(String::from)); - self - } - - /// Set additional scopes. - /// - /// Calling this when already set will append to the existing scopes, not overwrite them. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::keys::options::Options; - /// # - /// let options = Options::builder("New Key", ["member"]) - /// .scopes(["admin"]) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::keys::options::Options; - /// # - /// let options1 = Options::builder("New Key", ["member"]) - /// .scopes(["admin"]) - /// .build(); - /// - /// let options2 = Options::builder("New Key", ["member", "admin"]).build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn scopes<'a>(mut self, scopes: impl IntoIterator) -> Self { - self.0.scopes.extend(scopes.into_iter().map(String::from)); - self - } - - /// Set the expiration date. - /// - /// This will unset the time to live in seconds. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::keys::options::Options; - /// # - /// let options = Options::builder("New Key", ["member"]) - /// .expiration_date("2038-01-19") - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::keys::options::Options; - /// # - /// let options1 = Options::builder("New Key", ["member"]) - /// .time_to_live_in_seconds(7776000) - /// .expiration_date("2038-01-19") - /// .build(); - /// - /// let options2 = Options::builder("New Key", ["member"]) - /// .expiration_date("2038-01-19") - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn expiration_date(mut self, expiration_date: impl Into) -> Self { - self.0.expiration = Some(Expiration::ExpirationDate(expiration_date.into())); - self - } - - /// Set the time to live in seconds. - /// - /// This will unset the expiration date. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::keys::options::Options; - /// # - /// let options = Options::builder("New Key", ["member"]) - /// .time_to_live_in_seconds(7776000) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::keys::options::Options; - /// # - /// let options1 = Options::builder("New Key", ["member"]) - /// .expiration_date("2038-01-19") - /// .time_to_live_in_seconds(7776000) - /// .build(); - /// - /// let options2 = Options::builder("New Key", ["member"]) - /// .time_to_live_in_seconds(7776000) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn time_to_live_in_seconds(mut self, time_to_live_in_seconds: usize) -> Self { - self.0.expiration = Some(Expiration::TimeToLiveInSeconds(time_to_live_in_seconds)); - self - } - - /// Finish building the [`Options`] object. - pub fn build(self) -> Options { - self.0 - } -} - -impl<'a> From<&'a Options> for SerializableOptions<'a> { - fn from(options: &'a Options) -> Self { - // Destructuring it makes sure that we don't forget to use any of it - let Options { - comment, - tags, - scopes, - expiration, - } = options; - - let mut serializable_options = Self { - comment, - tags, - scopes, - expiration_date: None, - time_to_live_in_seconds: None, - }; - - match expiration { - Some(Expiration::ExpirationDate(expiration_date)) => { - serializable_options.expiration_date = Some(expiration_date); - } - Some(Expiration::TimeToLiveInSeconds(time_to_live_in_seconds)) => { - serializable_options.time_to_live_in_seconds = Some(*time_to_live_in_seconds); - } - None => {} - }; - - serializable_options - } -} diff --git a/deepgram-rust-sdk/src/keys/response.rs b/deepgram-rust-sdk/src/keys/response.rs deleted file mode 100644 index 7b3a885..0000000 --- a/deepgram-rust-sdk/src/keys/response.rs +++ /dev/null @@ -1,111 +0,0 @@ -//! Deepgram keys API response types. - -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -pub use crate::response::Message; - -/// Returned by [`Keys::list`](super::Keys::list). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#keys-get-keys -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct MembersAndApiKeys { - #[allow(missing_docs)] - pub api_keys: Vec, -} - -/// Returned by [`Keys::get`](super::Keys::get). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#keys-get-key -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct MemberAndApiKey { - #[allow(missing_docs)] - pub member: Member, - - #[allow(missing_docs)] - pub api_key: ApiKey, -} - -/// Details of a single member. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#keys-get-key -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Member { - #[allow(missing_docs)] - pub member_id: Uuid, - - #[allow(missing_docs)] - pub first_name: Option, - - #[allow(missing_docs)] - pub last_name: Option, - - #[allow(missing_docs)] - pub email: String, -} - -/// Details of a single API key. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#keys-get-key -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct ApiKey { - #[allow(missing_docs)] - pub api_key_id: Uuid, - - #[allow(missing_docs)] - pub comment: String, - - #[allow(missing_docs)] - pub scopes: Vec, - - #[allow(missing_docs)] - pub tags: Option>, - - #[allow(missing_docs)] - pub created: String, - - #[allow(missing_docs)] - pub expiration_date: Option, -} - -/// Returned by [`Keys::create`](super::Keys::create). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#keys-create -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct NewApiKey { - #[allow(missing_docs)] - pub api_key_id: Uuid, - - #[allow(missing_docs)] - pub key: String, - - #[allow(missing_docs)] - pub comment: String, - - #[allow(missing_docs)] - pub scopes: Vec, - - #[allow(missing_docs)] - pub tags: Option>, - - #[allow(missing_docs)] - pub created: String, - - #[allow(missing_docs)] - pub expiration_date: Option, -} diff --git a/deepgram-rust-sdk/src/lib.rs b/deepgram-rust-sdk/src/lib.rs deleted file mode 100644 index a10ad53..0000000 --- a/deepgram-rust-sdk/src/lib.rs +++ /dev/null @@ -1,136 +0,0 @@ -#![forbid(unsafe_code)] -#![warn(missing_debug_implementations, clippy::cargo)] -#![allow(clippy::multiple_crate_versions, clippy::derive_partial_eq_without_eq)] - -//! Official Rust SDK for Deepgram's automated speech recognition APIs. -//! -//! Get started transcribing with a [`Transcription`](transcription::Transcription) object. - -use std::io; - -use reqwest::{ - header::{HeaderMap, HeaderValue}, - RequestBuilder, -}; -use serde::de::DeserializeOwned; -use thiserror::Error; - -pub mod billing; -pub mod invitations; -pub mod keys; -pub mod members; -pub mod projects; -pub mod scopes; -pub mod transcription; -pub mod usage; - -mod response; - -/// A client for the Deepgram API. -/// -/// Make transcriptions requests using [`Deepgram::transcription`]. -#[derive(Debug, Clone)] -pub struct Deepgram { - api_key: String, - client: reqwest::Client, -} - -/// Errors that may arise from the [`deepgram`](crate) crate. -// TODO sub-errors for the different types? -#[derive(Debug, Error)] -pub enum DeepgramError { - /// No source was provided to the request builder. - #[error("No source was provided to the request builder.")] - NoSource, - - /// The Deepgram API returned an error. - #[error("The Deepgram API returned an error.")] - DeepgramApiError { - /// Error message from the Deepgram API. - body: String, - - /// Underlying [`reqwest::Error`] from the HTTP request. - err: reqwest::Error, - }, - - /// Something went wrong when generating the http request. - #[error("Something went wrong when generating the http request: {0}")] - HttpError(#[from] http::Error), - - /// Something went wrong when making the HTTP request. - #[error("Something went wrong when making the HTTP request: {0}")] - ReqwestError(#[from] reqwest::Error), - - /// Something went wrong during I/O. - #[error("Something went wrong during I/O: {0}")] - IoError(#[from] io::Error), - - /// Something went wrong with WS. - #[error("Something went wrong with WS: {0}")] - WsError(#[from] tungstenite::Error), - - /// Something went wrong during serialization/deserialization. - #[error("Something went wrong during serialization/deserialization: {0}")] - SerdeError(#[from] serde_json::Error), -} - -type Result = std::result::Result; - -impl Deepgram { - /// Construct a new Deepgram client. - /// - /// Create your first API key on the [Deepgram Console][console]. - /// - /// [console]: https://console.deepgram.com/ - /// - /// # Panics - /// - /// Panics under the same conditions as [`reqwest::Client::new`]. - pub fn new>(api_key: K) -> Self { - static USER_AGENT: &str = concat!( - env!("CARGO_PKG_NAME"), - "/", - env!("CARGO_PKG_VERSION"), - " rust", - ); - - let authorization_header = { - let mut header = HeaderMap::new(); - header.insert( - "Authorization", - HeaderValue::from_str(&format!("Token {}", api_key.as_ref())) - .expect("Invalid API key"), - ); - header - }; - let api_key = api_key.as_ref().to_owned(); - - Deepgram { - api_key, - client: reqwest::Client::builder() - .user_agent(USER_AGENT) - .default_headers(authorization_header) - .build() - // Even though `reqwest::Client::new` is not used here, it will always panic under the same conditions - .expect("See reqwest::Client::new docs for cause of panic"), - } - } -} - -/// Sends the request and checks the response for an error. -/// -/// If there is an error, it translates it into a [`DeepgramError::DeepgramApiError`]. -/// Otherwise, it deserializes the JSON accordingly. -async fn send_and_translate_response( - request_builder: RequestBuilder, -) -> crate::Result { - let response = request_builder.send().await?; - - match response.error_for_status_ref() { - Ok(_) => Ok(response.json().await?), - Err(err) => Err(DeepgramError::DeepgramApiError { - body: response.text().await?, - err, - }), - } -} diff --git a/deepgram-rust-sdk/src/members.rs b/deepgram-rust-sdk/src/members.rs deleted file mode 100644 index 8651da5..0000000 --- a/deepgram-rust-sdk/src/members.rs +++ /dev/null @@ -1,122 +0,0 @@ -//! Manage the members of a Deepgram Project. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#members - -use crate::{send_and_translate_response, Deepgram}; - -pub mod response; - -/// Manage the members of a Deepgram Project. -/// -/// Constructed using [`Deepgram::members`]. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#members -#[derive(Debug, Clone)] -pub struct Members<'a>(&'a Deepgram); - -impl Deepgram { - /// Construct a new [`Members`] from a [`Deepgram`]. - pub fn members(&self) -> Members<'_> { - self.into() - } -} - -impl<'a> From<&'a Deepgram> for Members<'a> { - /// Construct a new [`Members`] from a [`Deepgram`]. - fn from(deepgram: &'a Deepgram) -> Self { - Self(deepgram) - } -} - -impl Members<'_> { - /// Get all members of the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#members-get-members - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let members = dg_client - /// .members() - /// .list_members(&project_id) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn list_members(&self, project_id: &str) -> crate::Result { - let url = format!( - "https://api.deepgram.com/v1/projects/{}/members", - project_id, - ); - - send_and_translate_response(self.0.client.get(url)).await - } - - /// Remove the specified member from the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#members-delete - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// # let member_id = - /// # env::var("DEEPGRAM_MEMBER_ID").expect("DEEPGRAM_MEMBER_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// dg_client - /// .members() - /// .remove_member(&project_id, &member_id) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn remove_member( - &self, - project_id: &str, - member_id: &str, - ) -> crate::Result { - let url = format!( - "https://api.deepgram.com/v1/projects/{}/members/{}", - project_id, member_id, - ); - - send_and_translate_response(self.0.client.delete(url)).await - } -} diff --git a/deepgram-rust-sdk/src/members/response.rs b/deepgram-rust-sdk/src/members/response.rs deleted file mode 100644 index 578bc6d..0000000 --- a/deepgram-rust-sdk/src/members/response.rs +++ /dev/null @@ -1,42 +0,0 @@ -//! Deepgram members API response types. - -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -pub use crate::response::Message; - -/// Returned by [`Members::list_members`](super::Members::list_members). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#members-get-members -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Members { - #[allow(missing_docs)] - pub members: Vec, -} - -/// Returned by [`Members::list_members`](super::Members::list_members). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#members-get-members -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Member { - #[allow(missing_docs)] - pub member_id: Uuid, - - #[allow(missing_docs)] - pub first_name: Option, - - #[allow(missing_docs)] - pub last_name: Option, - - #[allow(missing_docs)] - pub scopes: Vec, - - #[allow(missing_docs)] - pub email: String, -} diff --git a/deepgram-rust-sdk/src/projects.rs b/deepgram-rust-sdk/src/projects.rs deleted file mode 100644 index 64a170e..0000000 --- a/deepgram-rust-sdk/src/projects.rs +++ /dev/null @@ -1,198 +0,0 @@ -//! Manage Deepgram Projects. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#projects - -use crate::{send_and_translate_response, Deepgram}; - -pub mod options; -pub mod response; - -use options::{Options, SerializableOptions}; -use response::{Message, Project}; - -/// Manage Deepgram Projects. -/// -/// Constructed using [`Deepgram::projects`]. -/// -/// You can create new Deepgram Projects on the [Deepgram Console][console]. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [console]: https://console.deepgram.com/ -/// [api]: https://developers.deepgram.com/api-reference/#projects -#[derive(Debug, Clone)] -pub struct Projects<'a>(&'a Deepgram); - -impl Deepgram { - /// Construct a new [`Projects`] from a [`Deepgram`]. - pub fn projects(&self) -> Projects<'_> { - self.into() - } -} - -impl<'a> From<&'a Deepgram> for Projects<'a> { - /// Construct a new [`Projects`] from a [`Deepgram`]. - fn from(deepgram: &'a Deepgram) -> Self { - Self(deepgram) - } -} - -impl Projects<'_> { - /// Get all projects. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#projects-get-projects - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{projects::options::Options, Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let projects = dg_client - /// .projects() - /// .list() - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn list(&self) -> crate::Result { - let request = self.0.client.get("https://api.deepgram.com/v1/projects"); - - send_and_translate_response(request).await - } - - /// Get a specific project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#projects-get-project - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{projects::options::Options, Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let project = dg_client - /// .projects() - /// .get(&project_id) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn get(&self, project_id: &str) -> crate::Result { - let url = format!("https://api.deepgram.com/v1/projects/{}", project_id); - - send_and_translate_response(self.0.client.get(url)).await - } - - /// Update the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#projects-update - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{projects::options::Options, Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let options = Options::builder() - /// .name("The Transcribinator") - /// .company("Doofenshmirtz Evil Incorporated") - /// .build(); - /// - /// dg_client - /// .projects() - /// .update(&project_id, &options) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn update(&self, project_id: &str, options: &Options) -> crate::Result { - let url = format!("https://api.deepgram.com/v1/projects/{}", project_id); - let request = self - .0 - .client - .patch(url) - .json(&SerializableOptions::from(options)); - - send_and_translate_response(request).await - } - - /// Delete the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#projects-get-delete - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{projects::options::Options, Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// dg_client - /// .projects() - /// .delete(&project_id) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn delete(&self, project_id: &str) -> crate::Result { - let url = format!("https://api.deepgram.com/v1/projects/{}", project_id); - let request = self.0.client.delete(url); - - send_and_translate_response(request).await - } -} diff --git a/deepgram-rust-sdk/src/projects/options.rs b/deepgram-rust-sdk/src/projects/options.rs deleted file mode 100644 index 133d69a..0000000 --- a/deepgram-rust-sdk/src/projects/options.rs +++ /dev/null @@ -1,102 +0,0 @@ -//! Set options for [`Projects::update`](super::Projects::update). -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#projects-update - -use serde::Serialize; - -/// Used as a parameter for [`Projects::update`](super::Projects::update). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#projects-update -#[derive(Debug, PartialEq, Eq, Clone, Hash)] -pub struct Options { - name: Option, - company: Option, -} - -/// Builds an [`Options`] object using [the Builder pattern][builder]. -/// -/// [builder]: https://rust-unofficial.github.io/patterns/patterns/creational/builder.html -#[derive(Debug, PartialEq, Clone)] -pub struct OptionsBuilder(Options); - -#[derive(Serialize)] -pub(super) struct SerializableOptions<'a> { - #[serde(skip_serializing_if = "Option::is_none")] - pub(super) name: &'a Option, - - #[serde(skip_serializing_if = "Option::is_none")] - pub(super) company: &'a Option, -} - -impl Options { - /// Construct a new [`OptionsBuilder`]. - pub fn builder() -> OptionsBuilder { - OptionsBuilder::new() - } -} - -impl OptionsBuilder { - /// Construct a new [`OptionsBuilder`]. - pub fn new() -> Self { - Self(Options { - name: None, - company: None, - }) - } - - /// Set the project name. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::projects::options::Options; - /// # - /// let options = Options::builder() - /// .name("The Transcribinator") - /// .build(); - /// ``` - pub fn name(mut self, name: impl Into) -> Self { - self.0.name = Some(name.into()); - self - } - - /// Set the project company. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::projects::options::Options; - /// # - /// let options = Options::builder() - /// .company("Doofenshmirtz Evil Incorporated") - /// .build(); - /// ``` - pub fn company(mut self, company: impl Into) -> Self { - self.0.company = Some(company.into()); - self - } - - /// Finish building the [`Options`] object. - pub fn build(self) -> Options { - self.0 - } -} - -impl Default for OptionsBuilder { - fn default() -> Self { - Self::new() - } -} - -impl<'a> From<&'a Options> for SerializableOptions<'a> { - fn from(options: &'a Options) -> Self { - // Destructuring it makes sure that we don't forget to use any of it - let Options { name, company } = options; - - Self { name, company } - } -} diff --git a/deepgram-rust-sdk/src/projects/response.rs b/deepgram-rust-sdk/src/projects/response.rs deleted file mode 100644 index 18c9e21..0000000 --- a/deepgram-rust-sdk/src/projects/response.rs +++ /dev/null @@ -1,36 +0,0 @@ -//! Deepgram projects API response types. - -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -pub use crate::response::Message; - -/// Returned by [`Projects::list`](super::Projects::list). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#projects-get-projects -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Projects { - #[allow(missing_docs)] - pub projects: Vec, -} - -/// Returned by [`Projects::get`](super::Projects::get). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#projects-get-project -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Project { - #[allow(missing_docs)] - pub project_id: Uuid, - - #[allow(missing_docs)] - pub name: String, - - #[allow(missing_docs)] - pub company: Option, -} diff --git a/deepgram-rust-sdk/src/response.rs b/deepgram-rust-sdk/src/response.rs deleted file mode 100644 index 6f58b50..0000000 --- a/deepgram-rust-sdk/src/response.rs +++ /dev/null @@ -1,15 +0,0 @@ -//! Response types that are shared by multiple parts of the API. - -use serde::{Deserialize, Serialize}; - -/// A success message. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/ -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Message { - #[allow(missing_docs)] - pub message: String, -} diff --git a/deepgram-rust-sdk/src/scopes.rs b/deepgram-rust-sdk/src/scopes.rs deleted file mode 100644 index aa75c99..0000000 --- a/deepgram-rust-sdk/src/scopes.rs +++ /dev/null @@ -1,140 +0,0 @@ -//! Manage the permissions of a Deepgram Project. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#scopes - -use serde::Serialize; - -use crate::{send_and_translate_response, Deepgram}; - -pub mod response; - -use response::Message; - -/// Manage the permissions of a Deepgram Project. -/// -/// Constructed using [`Deepgram::scopes`]. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#scopes -#[derive(Debug, Clone)] -pub struct Scopes<'a>(&'a Deepgram); - -impl Deepgram { - /// Construct a new [`Scopes`] from a [`Deepgram`]. - pub fn scopes(&self) -> Scopes<'_> { - self.into() - } -} - -impl<'a> From<&'a Deepgram> for Scopes<'a> { - /// Construct a new [`Scopes`] from a [`Deepgram`]. - fn from(deepgram: &'a Deepgram) -> Self { - Self(deepgram) - } -} - -impl Scopes<'_> { - /// Get the specified project scopes assigned to the specified member. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#scopes-get - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// # let member_id = - /// # env::var("DEEPGRAM_MEMBER_ID").expect("DEEPGRAM_MEMBER_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let scopes = dg_client - /// .scopes() - /// .get_scope(&project_id, &member_id) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn get_scope( - &self, - project_id: &str, - member_id: &str, - ) -> crate::Result { - let url = format!( - "https://api.deepgram.com/v1/projects/{}/members/{}/scopes ", - project_id, member_id - ); - - send_and_translate_response(self.0.client.get(url)).await - } - - /// Update the specified project scopes assigned to the specified member. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#scopes-update - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{Deepgram, DeepgramError}; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// # let member_id = - /// # env::var("DEEPGRAM_MEMBER_ID").expect("DEEPGRAM_MEMBER_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// dg_client - /// .scopes() - /// .update_scope(&project_id, &member_id, "member") - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn update_scope( - &self, - project_id: &str, - member_id: &str, - scope: &str, - ) -> crate::Result { - #[derive(Serialize)] - struct Scope<'a> { - scope: &'a str, - } - - let url = format!( - "https://api.deepgram.com/v1/projects/{}/members/{}/scopes", - project_id, member_id - ); - let request = self.0.client.put(url).json(&Scope { scope }); - - send_and_translate_response(request).await - } -} diff --git a/deepgram-rust-sdk/src/scopes/response.rs b/deepgram-rust-sdk/src/scopes/response.rs deleted file mode 100644 index 993874a..0000000 --- a/deepgram-rust-sdk/src/scopes/response.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! Deepgram TODO API response types. - -use serde::{Deserialize, Serialize}; - -pub use crate::response::Message; - -/// Scopes associated with the member. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#scopes-get -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Scopes { - #[allow(missing_docs)] - pub scopes: Vec, -} diff --git a/deepgram-rust-sdk/src/transcription.rs b/deepgram-rust-sdk/src/transcription.rs deleted file mode 100644 index 6a576e7..0000000 --- a/deepgram-rust-sdk/src/transcription.rs +++ /dev/null @@ -1,34 +0,0 @@ -//! Transcribe audio using Deepgram's automated speech recognition. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#transcription - -use crate::Deepgram; - -pub mod live; -pub mod prerecorded; - -/// Transcribe audio using Deepgram's automated speech recognition. -/// -/// Constructed using [`Deepgram::transcription`]. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#transcription -#[derive(Debug, Clone)] -pub struct Transcription<'a>(&'a Deepgram); - -impl Deepgram { - /// Construct a new [`Transcription`] from a [`Deepgram`]. - pub fn transcription(&self) -> Transcription<'_> { - self.into() - } -} - -impl<'a> From<&'a Deepgram> for Transcription<'a> { - /// Construct a new [`Transcription`] from a [`Deepgram`]. - fn from(deepgram: &'a Deepgram) -> Self { - Self(deepgram) - } -} diff --git a/deepgram-rust-sdk/src/transcription/live.rs b/deepgram-rust-sdk/src/transcription/live.rs deleted file mode 100644 index eed1ea1..0000000 --- a/deepgram-rust-sdk/src/transcription/live.rs +++ /dev/null @@ -1,305 +0,0 @@ -// TODO: Remove this lint -// Currently not documented because interface of this module is still changing -#![allow(missing_docs)] - -//! Types used for live audio transcription. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#transcription-streaming - -use std::path::Path; -use std::pin::Pin; -use std::task::{Context, Poll}; -use std::time::Duration; - -use bytes::{Bytes, BytesMut}; -use futures::channel::mpsc::{self, Receiver}; -use futures::stream::StreamExt; -use futures::{SinkExt, Stream}; -use http::Request; -use pin_project::pin_project; -use serde::{Deserialize, Serialize}; -use tokio::fs::File; -use tokio_tungstenite::tungstenite::protocol::Message; -use tokio_util::io::ReaderStream; -use tungstenite::handshake::client; -use url::Url; - -use crate::{Deepgram, DeepgramError, Result}; - -use super::Transcription; - -#[derive(Debug)] -pub struct StreamRequestBuilder<'a, S, E> -where - S: Stream>, -{ - config: &'a Deepgram, - source: Option, - encoding: Option, - sample_rate: Option, - channels: Option, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct Word { - pub word: String, - pub start: f64, - pub end: f64, - pub confidence: f64, - pub speaker: u8, -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct Alternatives { - pub transcript: String, - pub words: Vec, -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct Channel { - pub alternatives: Vec, -} - -#[derive(Debug, Serialize, Deserialize)] -#[serde(untagged)] -pub enum StreamResponse { - TranscriptResponse { - duration: f64, - is_final: bool, - channel: Channel, - }, - TerminalResponse { - request_id: String, - created: String, - duration: f64, - channels: u32, - }, -} - -#[pin_project] -struct FileChunker { - chunk_size: usize, - buf: BytesMut, - #[pin] - file: ReaderStream, -} - -impl Transcription<'_> { - pub fn stream_request>>( - &self, - ) -> StreamRequestBuilder { - StreamRequestBuilder { - config: self.0, - source: None, - encoding: None, - sample_rate: None, - channels: None, - } - } -} - -impl FileChunker { - fn new(file: File, chunk_size: usize) -> Self { - FileChunker { - chunk_size, - buf: BytesMut::with_capacity(2 * chunk_size), - file: ReaderStream::new(file), - } - } -} - -impl Stream for FileChunker { - type Item = Result; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { - let mut this = self.project(); - - while this.buf.len() < *this.chunk_size { - match Pin::new(&mut this.file).poll_next(cx) { - Poll::Pending => return Poll::Pending, - Poll::Ready(next) => match next.transpose() { - Err(e) => return Poll::Ready(Some(Err(DeepgramError::from(e)))), - Ok(None) => { - if this.buf.is_empty() { - return Poll::Ready(None); - } else { - return Poll::Ready(Some(Ok(this - .buf - .split_to(this.buf.len()) - .freeze()))); - } - } - Ok(Some(next)) => { - this.buf.extend_from_slice(&next); - } - }, - } - } - - Poll::Ready(Some(Ok(this.buf.split_to(*this.chunk_size).freeze()))) - } -} - -impl<'a, S, E> StreamRequestBuilder<'a, S, E> -where - S: Stream>, -{ - pub fn stream(mut self, stream: S) -> Self { - self.source = Some(stream); - - self - } - - pub fn encoding(mut self, encoding: String) -> Self { - self.encoding = Some(encoding); - - self - } - - pub fn sample_rate(mut self, sample_rate: u32) -> Self { - self.sample_rate = Some(sample_rate); - - self - } - - pub fn channels(mut self, channels: u16) -> Self { - self.channels = Some(channels); - - self - } -} - -impl<'a> StreamRequestBuilder<'a, Receiver>, DeepgramError> { - pub async fn file( - mut self, - filename: impl AsRef, - frame_size: usize, - frame_delay: Duration, - ) -> Result>, DeepgramError>> { - let file = File::open(filename).await?; - let mut chunker = FileChunker::new(file, frame_size); - let (mut tx, rx) = mpsc::channel(1); - let task = async move { - while let Some(frame) = chunker.next().await { - tokio::time::sleep(frame_delay).await; - // This unwrap() is safe because application logic dictates that the Receiver won't - // be dropped before the Sender. - tx.send(frame).await.unwrap(); - } - }; - tokio::spawn(task); - - self.source = Some(rx); - Ok(self) - } -} - -impl StreamRequestBuilder<'_, S, E> -where - S: Stream> + Send + Unpin + 'static, - E: Send + std::fmt::Debug, -{ - pub async fn start(self) -> Result>> { - let StreamRequestBuilder { - config, - source, - encoding, - sample_rate, - channels, - } = self; - let mut source = source - .ok_or(DeepgramError::NoSource)? - .map(|res| res.map(|bytes| Message::binary(Vec::from(bytes.as_ref())))); - - // This unwrap is safe because we're parsing a static. - let mut base = Url::parse("wss://api.deepgram.com/v1/listen").unwrap(); - { - let mut pairs = base.query_pairs_mut(); - if let Some(encoding) = encoding { - pairs.append_pair("encoding", &encoding); - } - if let Some(sample_rate) = sample_rate { - pairs.append_pair("sample_rate", &sample_rate.to_string()); - } - if let Some(channels) = channels { - pairs.append_pair("channels", &channels.to_string()); - } - pairs.append_pair("model", "nova-2-general"); - pairs.append_pair("language", "en"); - // pairs.append_pair("version", "beta"); - pairs.append_pair("diarize", "true"); - pairs.append_pair("interim_results", "true"); - pairs.append_pair("filler_words", "true"); - pairs.append_pair("utterance_end_ms", "1000"); - pairs.append_pair("endpointing", "500"); - pairs.append_pair("keywords", "ChatGPT:1.0"); - pairs.append_pair("keywords", "GPT:1.0"); - - // - } - - dbg!(&base); - - let request = Request::builder() - .method("GET") - .uri(base.to_string()) - .header("authorization", format!("token {}", config.api_key)) - .header("sec-websocket-key", client::generate_key()) - .header("host", "api.deepgram.com") - .header("connection", "upgrade") - .header("upgrade", "websocket") - .header("sec-websocket-version", "13") - .body(())?; - let (ws_stream, _) = tokio_tungstenite::connect_async(request).await?; - let (mut write, mut read) = ws_stream.split(); - let (mut tx, rx) = mpsc::channel::>(1); - - let send_task = async move { - loop { - match source.next().await { - None => break, - Some(Ok(frame)) => { - // This unwrap is not safe. - write.send(frame).await.unwrap(); - } - Some(e) => { - let _ = dbg!(e); - break; - } - } - } - - // This unwrap is not safe. - write.send(Message::binary([])).await.unwrap(); - }; - - let recv_task = async move { - loop { - match read.next().await { - None => break, - Some(Ok(msg)) => { - if let Message::Text(txt) = msg { - let resp = serde_json::from_str(&txt).map_err(DeepgramError::from); - tx.send(resp) - .await - // This unwrap is probably not safe. - .unwrap(); - } - } - Some(e) => { - let _ = dbg!(e); - break; - } - } - } - }; - - tokio::spawn(async move { - tokio::join!(send_task, recv_task); - }); - - Ok(rx) - } -} diff --git a/deepgram-rust-sdk/src/transcription/prerecorded.rs b/deepgram-rust-sdk/src/transcription/prerecorded.rs deleted file mode 100644 index 2371361..0000000 --- a/deepgram-rust-sdk/src/transcription/prerecorded.rs +++ /dev/null @@ -1,270 +0,0 @@ -//! Types used for pre-recorded audio transcription. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded - -use reqwest::RequestBuilder; - -use super::Transcription; -use crate::send_and_translate_response; - -pub mod audio_source; -pub mod options; -pub mod response; - -use audio_source::AudioSource; -use options::{Options, SerializableOptions}; -use response::{CallbackResponse, Response}; - -static DEEPGRAM_API_URL_LISTEN: &str = "https://api.deepgram.com/v1/listen"; - -impl Transcription<'_> { - /// Sends a request to Deepgram to transcribe pre-recorded audio. - /// If you wish to use the Callback feature, you should use [`Transcription::prerecorded_callback`] instead. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{ - /// # transcription::prerecorded::{ - /// # audio_source::AudioSource, - /// # options::{Language, Options}, - /// # }, - /// # Deepgram, DeepgramError, - /// # }; - /// # - /// # static AUDIO_URL: &str = "https://static.deepgram.com/examples/Bueller-Life-moves-pretty-fast.wav"; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let source = AudioSource::from_url(AUDIO_URL); - /// - /// let options = Options::builder() - /// .punctuate(true) - /// .language(Language::en_US) - /// .build(); - /// - /// let response = dg_client - /// .transcription() - /// .prerecorded(source, &options) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn prerecorded( - &self, - source: AudioSource, - options: &Options, - ) -> crate::Result { - let request_builder = self.make_prerecorded_request_builder(source, options); - - send_and_translate_response(request_builder).await - } - - /// Sends a request to Deepgram to transcribe pre-recorded audio using the Callback feature. - /// Otherwise behaves similarly to [`Transcription::prerecorded`]. - /// - /// See the [Deepgram Callback feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/callback/ - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{ - /// # transcription::prerecorded::{ - /// # audio_source::AudioSource, - /// # options::{Language, Options}, - /// # }, - /// # Deepgram, DeepgramError, - /// # }; - /// # - /// # static AUDIO_URL: &str = "https://static.deepgram.com/examples/Bueller-Life-moves-pretty-fast.wav"; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let source = AudioSource::from_url(AUDIO_URL); - /// - /// let options = Options::builder() - /// .punctuate(true) - /// .language(Language::en_US) - /// .build(); - /// - /// # let callback_url = - /// # env::var("DEEPGRAM_CALLBACK_URL").expect("DEEPGRAM_CALLBACK_URL environmental variable"); - /// # - /// let response = dg_client - /// .transcription() - /// .prerecorded_callback(source, &options, &callback_url) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn prerecorded_callback( - &self, - source: AudioSource, - options: &Options, - callback: &str, - ) -> crate::Result { - let request_builder = - self.make_prerecorded_callback_request_builder(source, options, callback); - - send_and_translate_response(request_builder).await - } - - /// Makes a [`reqwest::RequestBuilder`] without actually sending the request. - /// This allows you to modify the request before it is sent. - /// - /// Avoid using this where possible. - /// By customizing the request, there is less of a guarantee that it will conform to the Deepgram API. - /// Prefer using [`Transcription::prerecorded`]. - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{ - /// # transcription::prerecorded::{ - /// # audio_source::AudioSource, - /// # options::{Language, Options}, - /// # response::Response, - /// # }, - /// # Deepgram, DeepgramError, - /// # }; - /// # - /// # static AUDIO_URL: &str = "https://static.deepgram.com/examples/Bueller-Life-moves-pretty-fast.wav"; - /// # - /// # #[tokio::main] - /// # async fn main() -> reqwest::Result<()> { - /// # - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let dg_client = Deepgram::new(&deepgram_api_key); - /// # - /// # let source = AudioSource::from_url(AUDIO_URL); - /// # - /// # let options = Options::builder() - /// # .punctuate(true) - /// # .language(Language::en_US) - /// # .build(); - /// # - /// let request_builder = dg_client - /// .transcription() - /// .make_prerecorded_request_builder(source, &options); - /// - /// // Customize the RequestBuilder here - /// let customized_request_builder = request_builder - /// .query(&[("custom_query_key", "custom_query_value")]) - /// .header("custom_header_key", "custom_header_value"); - /// - /// // It is necessary to annotate the type of response here - /// // That way it knows what type to deserialize the JSON into - /// let response: Response = customized_request_builder.send().await?.json().await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub fn make_prerecorded_request_builder( - &self, - source: AudioSource, - options: &Options, - ) -> RequestBuilder { - let request_builder = self - .0 - .client - .post(DEEPGRAM_API_URL_LISTEN) - .query(&SerializableOptions(options)); - - source.fill_body(request_builder) - } - - /// Similar to [`Transcription::make_prerecorded_request_builder`], - /// but for the purposes of a [callback request][callback]. - /// - /// You should avoid using this where possible too, preferring [`Transcription::prerecorded_callback`]. - /// - /// [callback]: https://developers.deepgram.com/documentation/features/callback/ - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{ - /// # transcription::prerecorded::{ - /// # audio_source::AudioSource, - /// # options::{Language, Options}, - /// # response::CallbackResponse, - /// # }, - /// # Deepgram, DeepgramError, - /// # }; - /// # - /// # static AUDIO_URL: &str = "https://static.deepgram.com/examples/Bueller-Life-moves-pretty-fast.wav"; - /// # - /// # #[tokio::main] - /// # async fn main() -> reqwest::Result<()> { - /// # - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let dg_client = Deepgram::new(&deepgram_api_key); - /// # - /// # let source = AudioSource::from_url(AUDIO_URL); - /// # - /// # let options = Options::builder() - /// # .punctuate(true) - /// # .language(Language::en_US) - /// # .build(); - /// # - /// # let callback_url = - /// # env::var("DEEPGRAM_CALLBACK_URL").expect("DEEPGRAM_CALLBACK_URL environmental variable"); - /// # - /// let request_builder = dg_client - /// .transcription() - /// .make_prerecorded_callback_request_builder(source, &options, &callback_url); - /// - /// // Customize the RequestBuilder here - /// let customized_request_builder = request_builder - /// .query(&[("custom_query_key", "custom_query_value")]) - /// .header("custom_header_key", "custom_header_value"); - /// - /// // It is necessary to annotate the type of response here - /// // That way it knows what type to deserialize the JSON into - /// let response: CallbackResponse = customized_request_builder.send().await?.json().await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub fn make_prerecorded_callback_request_builder( - &self, - source: AudioSource, - options: &Options, - callback: &str, - ) -> RequestBuilder { - self.make_prerecorded_request_builder(source, options) - .query(&[("callback", callback)]) - } -} diff --git a/deepgram-rust-sdk/src/transcription/prerecorded/audio_source.rs b/deepgram-rust-sdk/src/transcription/prerecorded/audio_source.rs deleted file mode 100644 index f42c375..0000000 --- a/deepgram-rust-sdk/src/transcription/prerecorded/audio_source.rs +++ /dev/null @@ -1,79 +0,0 @@ -//! Sources of audio that can be transcribed. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded - -use reqwest::{header::CONTENT_TYPE, RequestBuilder}; -use serde::Serialize; - -/// Used as a parameter for [`Transcription::prerecorded`](crate::transcription::Transcription::prerecorded) and similar functions. -#[derive(Debug)] -pub struct AudioSource(InternalAudioSource); - -#[derive(Debug)] -enum InternalAudioSource { - Url(String), - Buffer { - buffer: reqwest::Body, - mime_type: Option, - }, -} - -impl AudioSource { - /// Constructs an [`AudioSource`] that will instruct Deepgram to download the audio from the specified URL. - pub fn from_url(url: impl Into) -> Self { - Self(InternalAudioSource::Url(url.into())) - } - - /// Constructs an [`AudioSource`] that will upload the raw binary audio data to Deepgram as part of the request. - /// - /// The buffer can be any type that implements [`Into`], such as a [`tokio::fs::File`]. - /// See [trait implementations for `reqwest::Body`](reqwest::Body#trait-implementations) - /// for a list of types that already implement it. - /// - /// Use [`AudioSource::from_buffer_with_mime_type`] if you want to specify a [MIME type][mime]. - /// - /// [mime]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#audio_and_video_types - pub fn from_buffer(buffer: impl Into) -> Self { - Self(InternalAudioSource::Buffer { - buffer: buffer.into(), - mime_type: None, - }) - } - - /// Same as [`AudioSource::from_buffer`], but allows you to specify a [MIME type][mime]. - /// - /// [mime]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#audio_and_video_types - pub fn from_buffer_with_mime_type( - buffer: impl Into, - mime_type: impl Into, - ) -> Self { - Self(InternalAudioSource::Buffer { - buffer: buffer.into(), - mime_type: Some(mime_type.into()), - }) - } - - pub(super) fn fill_body(self, request_builder: RequestBuilder) -> RequestBuilder { - match self.0 { - InternalAudioSource::Url(url) => { - #[derive(Serialize)] - struct UrlSource { - url: String, - } - - request_builder.json(&UrlSource { url }) - } - InternalAudioSource::Buffer { buffer, mime_type } => { - let request_builder = request_builder.body(buffer); - - if let Some(mime_type) = mime_type { - request_builder.header(CONTENT_TYPE, mime_type) - } else { - request_builder - } - } - } - } -} diff --git a/deepgram-rust-sdk/src/transcription/prerecorded/options.rs b/deepgram-rust-sdk/src/transcription/prerecorded/options.rs deleted file mode 100644 index 6a795db..0000000 --- a/deepgram-rust-sdk/src/transcription/prerecorded/options.rs +++ /dev/null @@ -1,1766 +0,0 @@ -//! Set various Deepgram features to control how the audio is transcribed. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/documentation/features/ - -use serde::{ser::SerializeSeq, Serialize}; - -/// Used as a parameter for [`Transcription::prerecorded`](crate::transcription::Transcription::prerecorded) and similar functions. -#[derive(Debug, PartialEq, Clone)] -pub struct Options { - tier: Option, - model: Option, - version: Option, - language: Option, - punctuate: Option, - profanity_filter: Option, - redact: Vec, - diarize: Option, - ner: Option, - multichannel: Option, - alternatives: Option, - numerals: Option, - search: Vec, - replace: Vec, - keywords: Vec, - keyword_boost_legacy: bool, - utterances: Option, - tags: Vec, - detect_language: Option, -} - -/// Used as a parameter for [`OptionsBuilder::tier`]. -/// -/// See the [Deepgram Tier feature docs][docs] for more info. -/// -/// [docs]: https://developers.deepgram.com/documentation/features/tier/ -#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)] -#[non_exhaustive] -pub enum Tier { - #[allow(missing_docs)] - Enhanced, - - #[allow(missing_docs)] - Base, -} - -/// Used as a parameter for [`OptionsBuilder::model`] and [`OptionsBuilder::multichannel_with_models`]. -/// -/// See the [Deepgram Model feature docs][docs] for more info. -/// -/// [docs]: https://developers.deepgram.com/documentation/features/model/ -#[derive(Debug, PartialEq, Eq, Clone, Hash)] -#[non_exhaustive] -pub enum Model { - #[allow(missing_docs)] - General, - - #[allow(missing_docs)] - Meeting, - - #[allow(missing_docs)] - Phonecall, - - #[allow(missing_docs)] - Voicemail, - - #[allow(missing_docs)] - Finance, - - #[allow(missing_docs)] - Conversationalai, - - #[allow(missing_docs)] - Video, - - #[allow(missing_docs)] - CustomId(String), -} - -/// Used as a parameter for [`OptionsBuilder::language`]. -/// -/// See the [Deepgram Language feature docs][docs] for more info. -/// -/// [docs]: https://developers.deepgram.com/documentation/features/language/ -#[allow(non_camel_case_types)] // Variants should look like their BCP-47 tag -#[derive(Debug, PartialEq, Eq, Clone, Hash)] -#[non_exhaustive] -pub enum Language { - #[allow(missing_docs)] - zh, - - #[allow(missing_docs)] - zh_CN, - - #[allow(missing_docs)] - zh_TW, - - #[allow(missing_docs)] - nl, - - #[allow(missing_docs)] - en, - - #[allow(missing_docs)] - en_AU, - - #[allow(missing_docs)] - en_GB, - - #[allow(missing_docs)] - en_IN, - - #[allow(missing_docs)] - en_NZ, - - #[allow(missing_docs)] - en_US, - - #[allow(missing_docs)] - fr, - - #[allow(missing_docs)] - fr_CA, - - #[allow(missing_docs)] - de, - - #[allow(missing_docs)] - hi, - - #[allow(missing_docs)] - hi_Latn, - - #[allow(missing_docs)] - id, - - #[allow(missing_docs)] - it, - - #[allow(missing_docs)] - ja, - - #[allow(missing_docs)] - ko, - - #[allow(missing_docs)] - pt, - - #[allow(missing_docs)] - pt_BR, - - #[allow(missing_docs)] - ru, - - #[allow(missing_docs)] - es, - - #[allow(missing_docs)] - es_419, - - #[allow(missing_docs)] - sv, - - #[allow(missing_docs)] - tr, - - #[allow(missing_docs)] - uk, - - /// Avoid using the `Other` variant where possible. - /// It exists so that you can use new languages that Deepgram supports without being forced to update your version of the SDK. - /// See the [Deepgram Language feature docs][docs] for the most up-to-date list of supported languages. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/language/ - Other(String), -} - -/// Used as a parameter for [`OptionsBuilder::redact`]. -/// -/// See the [Deepgram Redaction feature docs][docs] for more info. -/// -/// [docs]: https://developers.deepgram.com/documentation/features/redact/ -#[derive(Debug, PartialEq, Eq, Clone, Hash)] -#[non_exhaustive] -pub enum Redact { - #[allow(missing_docs)] - Pci, - - #[allow(missing_docs)] - Numbers, - - #[allow(missing_docs)] - Ssn, - - /// Avoid using the `Other` variant where possible. - /// It exists so that you can use new redactable items that Deepgram supports without being forced to update your version of the SDK. - /// See the [Deepgram Redact feature docs][docs] for the most up-to-date list of redactable items. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/redact/ - Other(String), -} - -/// Used as a parameter for [`OptionsBuilder::replace`]. -/// -/// See the [Deepgram Find and Replace feature docs][docs] for more info. -/// -/// [docs]: https://developers.deepgram.com/documentation/features/replace/ -#[derive(Debug, PartialEq, Eq, Clone, Hash)] -pub struct Replace { - /// The term or phrase to find. - pub find: String, - - /// The term or phrase to replace [`find`](Replace::find) with. - /// If set to [`None`], [`find`](Replace::find) will be removed from the transcript without being replaced by anything. - pub replace: Option, -} - -/// Used as a parameter for [`OptionsBuilder::keywords_with_intensifiers`]. -/// -/// See the [Deepgram Keywords feature docs][docs] for more info. -/// -/// [docs]: https://developers.deepgram.com/documentation/features/keywords/ -#[derive(Debug, PartialEq, Clone)] -pub struct Keyword { - /// The keyword to boost. - pub keyword: String, - - /// Optionally specify how much to boost it. - pub intensifier: Option, -} - -#[derive(Debug, PartialEq, Clone, Copy)] -enum Utterances { - Disabled, - Enabled { utt_split: Option }, -} - -#[derive(Debug, PartialEq, Eq, Clone, Hash)] -enum Multichannel { - Disabled, - Enabled { models: Option> }, -} - -/// Builds an [`Options`] object using [the Builder pattern][builder]. -/// -/// Use it to set of Deepgram's features, excluding the Callback feature. -/// The Callback feature can be set when making the request by calling [`Transcription::prerecorded_callback`](crate::transcription::Transcription::prerecorded_callback). -/// -/// [builder]: https://rust-unofficial.github.io/patterns/patterns/creational/builder.html -#[derive(Debug, PartialEq, Clone)] -pub struct OptionsBuilder(Options); - -#[derive(Debug, PartialEq, Clone)] -pub(super) struct SerializableOptions<'a>(pub(super) &'a Options); - -impl Options { - /// Construct a new [`OptionsBuilder`]. - pub fn builder() -> OptionsBuilder { - OptionsBuilder::new() - } -} - -impl OptionsBuilder { - /// Construct a new [`OptionsBuilder`]. - pub fn new() -> Self { - Self(Options { - tier: None, - model: None, - version: None, - language: None, - punctuate: None, - profanity_filter: None, - redact: Vec::new(), - diarize: None, - ner: None, - multichannel: None, - alternatives: None, - numerals: None, - search: Vec::new(), - replace: Vec::new(), - keywords: Vec::new(), - keyword_boost_legacy: false, - utterances: None, - tags: Vec::new(), - detect_language: None, - }) - } - - /// Set the Tier feature. - /// - /// Not all tiers are supported for all models and languages. - /// For a list of models/languages and their supported models, - /// see the [Deepgram Language feature][language] docs. - /// - /// See the [Deepgram Tier feature docs][docs] for more info. - /// - /// [language]: https://developers.deepgram.com/documentation/features/language/ - /// [docs]: https://developers.deepgram.com/documentation/features/tier/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Options, Tier}; - /// # - /// let options = Options::builder() - /// .tier(Tier::Enhanced) - /// .build(); - /// ``` - pub fn tier(mut self, tier: Tier) -> Self { - self.0.tier = Some(tier); - self - } - - /// Set the Model feature. - /// - /// Not all models are supported for all languages. For a list of languages and their supported models, see - /// the [Deepgram Language feature][language] docs. - /// - /// If you previously set some models using [`OptionsBuilder::multichannel_with_models`], - /// calling this will overwrite the models you set there, but won't disable the Multichannel feature. - /// - /// See the [Deepgram Model feature docs][docs] for more info. - /// - /// [language]: https://developers.deepgram.com/documentation/features/language/ - /// [docs]: https://developers.deepgram.com/documentation/features/model/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Model, Options}; - /// # - /// let options = Options::builder() - /// .model(Model::General) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Model, Options}; - /// # - /// let options1 = Options::builder() - /// .multichannel_with_models([Model::Meeting, Model::Phonecall]) - /// .model(Model::General) - /// .build(); - /// - /// let options2 = Options::builder() - /// .multichannel(true) - /// .model(Model::General) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn model(mut self, model: Model) -> Self { - self.0.model = Some(model); - - if let Some(Multichannel::Enabled { models }) = &mut self.0.multichannel { - *models = None; - } - - self - } - - /// Set the Version feature. - /// - /// See the [Deepgram Version feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/version/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .version("12345678-1234-1234-1234-1234567890ab") - /// .build(); - /// ``` - pub fn version(mut self, version: &str) -> Self { - self.0.version = Some(version.into()); - self - } - - /// Set the Language feature. - /// - /// See the [Deepgram Language feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/language/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Language, Options}; - /// # - /// let options = Options::builder() - /// .language(Language::en_US) - /// .build(); - /// ``` - pub fn language(mut self, language: Language) -> Self { - self.0.language = Some(language); - self - } - - /// Set the Punctuation feature. - /// - /// See the [Deepgram Punctuation feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/punctuate/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .punctuate(true) - /// .build(); - /// ``` - pub fn punctuate(mut self, punctuate: bool) -> Self { - self.0.punctuate = Some(punctuate); - self - } - - /// Set the Profanity Filter feature. - /// - /// Not necessarily available for all languages. - /// - /// See the [Deepgram Profanity Filter feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/profanity-filter/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .profanity_filter(true) - /// .build(); - /// ``` - pub fn profanity_filter(mut self, profanity_filter: bool) -> Self { - self.0.profanity_filter = Some(profanity_filter); - self - } - - /// Set the Redaction feature. - /// - /// Not necessarily available for all languages. - /// - /// Calling this when already set will append to the existing redact items, not overwrite them. - /// - /// See the [Deepgram Redaction feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/redact/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Options, Redact}; - /// # - /// let options = Options::builder() - /// .redact([Redact::Pci, Redact::Ssn]) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Options, Redact}; - /// # - /// let options1 = Options::builder() - /// .redact([Redact::Pci]) - /// .redact([Redact::Ssn]) - /// .build(); - /// - /// let options2 = Options::builder() - /// .redact([Redact::Pci, Redact::Ssn]) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn redact(mut self, redact: impl IntoIterator) -> Self { - self.0.redact.extend(redact); - self - } - - /// Set the Diarization feature. - /// - /// See the [Deepgram Diarization feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/diarize/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .diarize(true) - /// .build(); - /// ``` - pub fn diarize(mut self, diarize: bool) -> Self { - self.0.diarize = Some(diarize); - self - } - - /// Set the Named-Entity Recognition feature. - /// - /// Not necessarily available for all languages. - /// - /// See the [Deepgram Named-Entity Recognition feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/named-entity-recognition/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .ner(true) - /// .build(); - /// ``` - pub fn ner(mut self, ner: bool) -> Self { - self.0.ner = Some(ner); - self - } - - /// Set the Multichannel feature. - /// - /// To specify which model should process each channel, use [`OptionsBuilder::multichannel_with_models`] instead. - /// If [`OptionsBuilder::multichannel_with_models`] is currently set, calling [`OptionsBuilder::multichannel`] - /// will reset the model to the last call to [`OptionsBuilder::model`]. - /// - /// See the [Deepgram Multichannel feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/multichannel/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .multichannel(true) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Model, Options}; - /// # - /// let options1 = Options::builder() - /// .model(Model::General) - /// .multichannel_with_models([Model::Meeting, Model::Phonecall]) - /// .multichannel(true) - /// .build(); - /// - /// let options2 = Options::builder() - /// .model(Model::General) - /// .multichannel(true) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn multichannel(mut self, multichannel: bool) -> Self { - self.0.multichannel = Some(if multichannel { - Multichannel::Enabled { models: None } - } else { - Multichannel::Disabled - }); - - self - } - - /// Set the Multichannel feature to true, specifying which model should process each channel. - /// - /// If you previously set a model using [`OptionsBuilder::model`], - /// calling this will overshadow the model you set there, but won't erase it. - /// It can be recovered by calling [`OptionsBuilder::multichannel`]. - /// - /// Calling this when multichannel models are already set will append to the existing models, not overwrite them. - /// - /// See the [Deepgram Multichannel feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/multichannel/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Model, Options}; - /// # - /// let options = Options::builder() - /// .multichannel_with_models([Model::Meeting, Model::Phonecall]) - /// .build(); - /// ``` - /// - /// ``` - /// # use std::env; - /// # - /// # use deepgram::{ - /// # transcription::prerecorded::{ - /// # audio_source::AudioSource, - /// # options::{Model, Options}, - /// # }, - /// # Deepgram, - /// # }; - /// # - /// # - /// # static AUDIO_URL: &str = "https://static.deepgram.com/examples/Bueller-Life-moves-pretty-fast.wav"; - /// # - /// # fn main() -> Result<(), reqwest::Error> { - /// # let deepgram_api_key = env::var("DEEPGRAM_API_KEY").unwrap_or_default(); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// let dg_transcription = dg_client.transcription(); - /// - /// let options1 = Options::builder() - /// .model(Model::General) - /// .multichannel_with_models([Model::Meeting, Model::Phonecall]) - /// .build(); - /// - /// let options2 = Options::builder() - /// .multichannel_with_models([Model::Meeting, Model::Phonecall]) - /// .build(); - /// - /// let request1 = dg_transcription - /// .make_prerecorded_request_builder(AudioSource::from_url(AUDIO_URL), &options1) - /// .build()?; - /// - /// let request2 = dg_transcription - /// .make_prerecorded_request_builder(AudioSource::from_url(AUDIO_URL), &options2) - /// .build()?; - /// - /// // Both make the same request to Deepgram with the same features - /// assert_eq!(request1.url(), request2.url()); - /// - /// // However, they technically aren't "equal" - /// // This is because `options1` still remembers the model you set previously - /// assert_ne!(options1, options2); - /// # - /// # Ok(()) - /// # } - /// ``` - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Model, Options}; - /// # - /// let options1 = Options::builder() - /// .model(Model::General) - /// .multichannel_with_models([Model::Meeting, Model::Phonecall]) - /// .multichannel(true) - /// .build(); - /// - /// let options2 = Options::builder() - /// .model(Model::General) - /// .multichannel(true) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Model, Options}; - /// # - /// let options1 = Options::builder() - /// .multichannel_with_models([Model::Meeting]) - /// .multichannel_with_models([Model::Phonecall]) - /// .build(); - /// - /// let options2 = Options::builder() - /// .multichannel_with_models([Model::Meeting, Model::Phonecall]) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn multichannel_with_models(mut self, models: impl IntoIterator) -> Self { - if let Some(Multichannel::Enabled { - models: Some(old_models), - }) = &mut self.0.multichannel - { - // Multichannel with models already enabled - // Don't overwrite existing models - old_models.extend(models); - } else { - // Multichannel with models already enabled - self.0.multichannel = Some(Multichannel::Enabled { - models: Some(models.into_iter().collect()), - }); - } - - self - } - - /// Set the Alternatives feature. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#alternatives-pr - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .alternatives(3) - /// .build(); - /// ``` - pub fn alternatives(mut self, alternatives: usize) -> Self { - self.0.alternatives = Some(alternatives); - self - } - - /// Set the Numerals feature. - /// - /// Not necessarily available for all languages. - /// - /// See the [Deepgram Numerals feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/numerals/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .numerals(true) - /// .build(); - /// ``` - pub fn numerals(mut self, numerals: bool) -> Self { - self.0.numerals = Some(numerals); - self - } - - /// Set the Search feature. - /// - /// Calling this when already set will append to the existing items, not overwrite them. - /// - /// See the [Deepgram Search feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/search/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .search(["hello", "world"]) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options1 = Options::builder() - /// .search(["hello"]) - /// .search(["world"]) - /// .build(); - /// - /// let options2 = Options::builder() - /// .search(["hello", "world"]) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn search<'a>(mut self, search: impl IntoIterator) -> Self { - self.0.search.extend(search.into_iter().map(String::from)); - self - } - - /// Set the Find and Replace feature. - /// - /// Calling this when already set will append to the existing replacements, not overwrite them. - /// - /// See the [Deepgram Find and Replace feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/replace/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Options, Replace}; - /// # - /// let options = Options::builder() - /// .replace([ - /// Replace { - /// find: String::from("Aaron"), - /// replace: Some(String::from("Erin")), - /// }, - /// Replace { - /// find: String::from("Voldemort"), - /// replace: None, - /// }, - /// ]) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Options, Replace}; - /// # - /// let options1 = Options::builder() - /// .replace([Replace { - /// find: String::from("Aaron"), - /// replace: Some(String::from("Erin")), - /// }]) - /// .replace([Replace { - /// find: String::from("Voldemort"), - /// replace: None, - /// }]) - /// .build(); - /// - /// let options2 = Options::builder() - /// .replace([ - /// Replace { - /// find: String::from("Aaron"), - /// replace: Some(String::from("Erin")), - /// }, - /// Replace { - /// find: String::from("Voldemort"), - /// replace: None, - /// }, - /// ]) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn replace(mut self, replace: impl IntoIterator) -> Self { - self.0.replace.extend(replace); - self - } - - /// Set the Keywords feature. - /// - /// To specify intensifiers, use [`OptionsBuilder::keywords_with_intensifiers`] instead. - /// - /// Calling this when already set will append to the existing keywords, not overwrite them. - /// This includes keywords set by [`OptionsBuilder::keywords_with_intensifiers`]. - /// - /// See the [Deepgram Keywords feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/keywords/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .keywords(["hello", "world"]) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options1 = Options::builder() - /// .keywords(["hello"]) - /// .keywords(["world"]) - /// .build(); - /// - /// let options2 = Options::builder() - /// .keywords(["hello", "world"]) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn keywords<'a>(mut self, keywords: impl IntoIterator) -> Self { - let iter = keywords.into_iter().map(|keyword| Keyword { - keyword: keyword.into(), - intensifier: None, - }); - - self.0.keywords.extend(iter); - self - } - - /// Set the Keywords feature, specifying intensifiers. - /// - /// If you do not need to specify intensifiers, you can use [`OptionsBuilder::keywords`] instead. - /// - /// Calling this when already set will append to the existing keywords, not overwrite them. - /// - /// See the [Deepgram Keywords feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/keywords/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Keyword, Options}; - /// # - /// let options = Options::builder() - /// .keywords_with_intensifiers([ - /// Keyword { - /// keyword: String::from("hello"), - /// intensifier: Some(-1.5), - /// }, - /// Keyword { - /// keyword: String::from("world"), - /// intensifier: None, - /// }, - /// ]) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::{Keyword, Options}; - /// # - /// let options1 = Options::builder() - /// .keywords_with_intensifiers([ - /// Keyword { - /// keyword: String::from("hello"), - /// intensifier: Some(-1.5), - /// }, - /// ]) - /// .keywords_with_intensifiers([ - /// Keyword { - /// keyword: String::from("world"), - /// intensifier: None, - /// }, - /// ]) - /// .build(); - /// - /// let options2 = Options::builder() - /// .keywords_with_intensifiers([ - /// Keyword { - /// keyword: String::from("hello"), - /// intensifier: Some(-1.5), - /// }, - /// Keyword { - /// keyword: String::from("world"), - /// intensifier: None, - /// }, - /// ]) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn keywords_with_intensifiers( - mut self, - keywords: impl IntoIterator, - ) -> Self { - self.0.keywords.extend(keywords); - self - } - - /// Use legacy keyword boosting. - /// - /// See the [Deepgram Keywords feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/keywords/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .keywords(["hello", "world"]) - /// .keyword_boost_legacy() - /// .build(); - /// ``` - pub fn keyword_boost_legacy(mut self) -> Self { - self.0.keyword_boost_legacy = true; - self - } - - /// Set the Utterances feature. - /// - /// To set the Utterance Split feature, use [`OptionsBuilder::utterances_with_utt_split`] instead. - /// - /// See the [Deepgram Utterances feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/utterances/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .utterances(true) - /// .build(); - /// ``` - pub fn utterances(mut self, utterances: bool) -> Self { - self.0.utterances = Some(if utterances { - Utterances::Enabled { utt_split: None } - } else { - Utterances::Disabled - }); - - self - } - - /// Set the Utterances feature and the Utterance Split feature. - /// - /// If you do not want to set the Utterance Split feature, use [`OptionsBuilder::utterances`] instead. - /// - /// See the [Deepgram Utterances feature docs][utterances-docs] - /// and the [Deepgram Utterance Split feature docs][utt_split-docs] for more info. - /// - /// [utterances-docs]: https://developers.deepgram.com/documentation/features/utterances/ - /// [utt_split-docs]: https://developers.deepgram.com/documentation/features/utterance-split/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .utterances_with_utt_split(0.9) - /// .build(); - /// ``` - pub fn utterances_with_utt_split(mut self, utt_split: f64) -> Self { - self.0.utterances = Some(Utterances::Enabled { - utt_split: Some(utt_split), - }); - self - } - - /// Set the Tag feature. - /// - /// Calling this when already set will append to the existing tags, not overwrite them. - /// - /// See the [Deepgram Tag feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/documentation/features/tag/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .tag(["Tag 1", "Tag 2"]) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options1 = Options::builder() - /// .tag(["Tag 1"]) - /// .tag(["Tag 2"]) - /// .build(); - /// - /// let options2 = Options::builder() - /// .tag(["Tag 1", "Tag 2"]) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn tag<'a>(mut self, tag: impl IntoIterator) -> Self { - self.0.tags.extend(tag.into_iter().map(String::from)); - self - } - - /// Set the Language Detection feature. - /// - /// See the [Deepgram Language Detection feature docs][docs] for more info. - /// - /// [docs]: https://developers.deepgram.com/docs/language-detection/ - /// - /// # Examples - /// - /// ``` - /// # use deepgram::transcription::prerecorded::options::Options; - /// # - /// let options = Options::builder() - /// .detect_language(true) - /// .build(); - /// ``` - pub fn detect_language(mut self, detect_language: bool) -> Self { - self.0.detect_language = Some(detect_language); - - self - } - /// Finish building the [`Options`] object. - pub fn build(self) -> Options { - self.0 - } -} - -impl Default for OptionsBuilder { - fn default() -> Self { - Self::new() - } -} - -impl Serialize for SerializableOptions<'_> { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - let mut seq = serializer.serialize_seq(None)?; - - // Destructuring it makes sure that we don't forget to use any of it - let Options { - tier, - model, - version, - language, - punctuate, - profanity_filter, - redact, - diarize, - ner, - multichannel, - alternatives, - numerals, - search, - replace, - keywords, - keyword_boost_legacy, - utterances, - tags, - detect_language, - } = self.0; - - if let Some(tier) = tier { - seq.serialize_element(&("tier", tier.as_ref()))?; - } - - match multichannel { - // Multichannels with models is enabled - // Ignore self.model field - Some(Multichannel::Enabled { - models: Some(models), - }) => { - seq.serialize_element(&("model", models_to_string(models)))?; - } - - // Multichannel with models is not enabled - // Use self.model field - Some(Multichannel::Enabled { models: None } | Multichannel::Disabled) | None => { - if let Some(model) = model { - seq.serialize_element(&("model", model.as_ref()))?; - } - } - }; - - if let Some(version) = version { - seq.serialize_element(&("version", version))?; - } - - if let Some(language) = language { - seq.serialize_element(&("language", language.as_ref()))?; - } - - if let Some(punctuate) = punctuate { - seq.serialize_element(&("punctuate", punctuate))?; - } - - if let Some(profanity_filter) = profanity_filter { - seq.serialize_element(&("profanity_filter", profanity_filter))?; - } - - for element in redact { - seq.serialize_element(&("redact", element.as_ref()))?; - } - - if let Some(diarize) = diarize { - seq.serialize_element(&("diarize", diarize))?; - } - - if let Some(ner) = ner { - seq.serialize_element(&("ner", ner))?; - } - - match multichannel { - Some(Multichannel::Disabled) => seq.serialize_element(&("multichannel", false))?, - Some(Multichannel::Enabled { models: _ }) => { - // Multichannel models are serialized above if they exist - // This is done instead of serializing the self.model field - seq.serialize_element(&("multichannel", true))?; - } - None => (), - }; - - if let Some(alternatives) = alternatives { - seq.serialize_element(&("alternatives", alternatives))?; - } - - if let Some(numerals) = numerals { - seq.serialize_element(&("numerals", numerals))?; - } - - for element in search { - seq.serialize_element(&("search", element))?; - } - - for element in replace { - if let Some(replace) = &element.replace { - seq.serialize_element(&("replace", format!("{}:{}", element.find, replace)))?; - } else { - seq.serialize_element(&("replace", &element.find))?; - } - } - - for element in keywords { - if let Some(intensifier) = element.intensifier { - seq.serialize_element(&( - "keywords", - format!("{}:{}", element.keyword, intensifier), - ))?; - } else { - seq.serialize_element(&("keywords", &element.keyword))?; - } - } - - if *keyword_boost_legacy { - seq.serialize_element(&("keyword_boost", "legacy"))?; - } - - match utterances { - Some(Utterances::Disabled) => seq.serialize_element(&("utterances", false))?, - Some(Utterances::Enabled { utt_split }) => { - seq.serialize_element(&("utterances", true))?; - - if let Some(utt_split) = utt_split { - seq.serialize_element(&("utt_split", utt_split))?; - } - } - None => (), - }; - - for element in tags { - seq.serialize_element(&("tag", element))?; - } - - if let Some(detect_language) = detect_language { - seq.serialize_element(&("detect_language", detect_language))?; - } - - seq.end() - } -} - -impl AsRef for Tier { - fn as_ref(&self) -> &str { - use Tier::*; - - match self { - Enhanced => "enhanced", - Base => "base", - } - } -} - -impl AsRef for Model { - fn as_ref(&self) -> &str { - use Model::*; - - match self { - General => "general", - Meeting => "meeting", - Phonecall => "phonecall", - Voicemail => "voicemail", - Finance => "finance", - Conversationalai => "conversationalai", - Video => "video", - CustomId(id) => id, - } - } -} - -impl AsRef for Language { - fn as_ref(&self) -> &str { - use Language::*; - - match self { - zh => "zh", - zh_CN => "zh-CN", - zh_TW => "zh-TW", - nl => "nl", - en => "en", - en_AU => "en-AU", - en_GB => "en-GB", - en_IN => "en-IN", - en_NZ => "en-NZ", - en_US => "en-US", - fr => "fr", - fr_CA => "fr-CA", - de => "de", - hi => "hi", - hi_Latn => "hi-Latn", - id => "id", - it => "it", - ja => "ja", - ko => "ko", - pt => "pt", - pt_BR => "pt-BR", - ru => "ru", - es => "es", - es_419 => "es-419", - sv => "sv", - tr => "tr", - uk => "uk", - Other(bcp_47_tag) => bcp_47_tag, - } - } -} - -impl AsRef for Redact { - fn as_ref(&self) -> &str { - use Redact::*; - - match self { - Pci => "pci", - Numbers => "numbers", - Ssn => "ssn", - Other(id) => id, - } - } -} - -fn models_to_string(models: &[Model]) -> String { - models - .iter() - .map(AsRef::::as_ref) - .collect::>() - .join(":") -} - -#[cfg(test)] -mod models_to_string_tests { - use super::{Model::*, *}; - - #[test] - fn empty() { - assert_eq!(models_to_string(&[]), ""); - } - - #[test] - fn one() { - assert_eq!(models_to_string(&[General]), "general"); - } - - #[test] - fn many() { - assert_eq!( - models_to_string(&[Phonecall, Meeting, Voicemail]), - "phonecall:meeting:voicemail" - ); - } - - #[test] - fn custom() { - assert_eq!( - models_to_string(&[ - Finance, - CustomId(String::from("extra_crispy")), - Conversationalai - ]), - "finance:extra_crispy:conversationalai" - ); - } -} - -#[cfg(test)] -mod serialize_options_tests { - use std::cmp; - use std::env; - - use super::{super::audio_source::AudioSource, *}; - use crate::Deepgram; - - fn check_serialization(options: &Options, expected: &str) { - let deepgram_api_key = env::var("DEEPGRAM_API_KEY").unwrap_or_default(); - - let dg_client = Deepgram::new(deepgram_api_key); - - let request = dg_client - .transcription() - .make_prerecorded_request_builder(AudioSource::from_url(""), options) - .build() - .unwrap(); - - let actual = request.url().query().unwrap_or(""); - - assert_eq!(actual, expected); - } - - fn generate_alphabet_test(key: &str, length: usize) -> (Vec<&str>, String) { - let letters = [ - "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", - "R", "S", "T", "U", "V", "W", "X", "Y", "Z", - ]; - - let limited_letters = Vec::from(&letters[..cmp::min(length, letters.len())]); - - let expected = limited_letters - .iter() - .map(|letter| format!("{}={}", key, letter)) - .collect::>() - .join("&"); - - (limited_letters, expected) - } - - #[test] - fn all_options() { - let options = Options::builder() - .tier(Tier::Enhanced) - .model(Model::General) - .version("1.2.3") - .language(Language::en_US) - .punctuate(true) - .profanity_filter(true) - .redact([Redact::Pci, Redact::Ssn]) - .diarize(true) - .ner(true) - .multichannel_with_models([ - Model::Finance, - Model::CustomId(String::from("extra_crispy")), - Model::Conversationalai, - ]) - .alternatives(4) - .numerals(true) - .search(["Rust", "Deepgram"]) - .replace([Replace { - find: String::from("Aaron"), - replace: Some(String::from("Erin")), - }]) - .keywords(["Ferris"]) - .keywords_with_intensifiers([Keyword { - keyword: String::from("Cargo"), - intensifier: Some(-1.5), - }]) - .utterances_with_utt_split(0.9) - .tag(["Tag 1"]) - .build(); - - check_serialization(&options, "tier=enhanced&model=finance%3Aextra_crispy%3Aconversationalai&version=1.2.3&language=en-US&punctuate=true&profanity_filter=true&redact=pci&redact=ssn&diarize=true&ner=true&multichannel=true&alternatives=4&numerals=true&search=Rust&search=Deepgram&replace=Aaron%3AErin&keywords=Ferris&keywords=Cargo%3A-1.5&utterances=true&utt_split=0.9&tag=Tag+1"); - } - - #[test] - fn tier() { - check_serialization( - &Options::builder().tier(Tier::Enhanced).build(), - "tier=enhanced", - ); - - check_serialization(&Options::builder().tier(Tier::Base).build(), "tier=base"); - } - - #[test] - fn model() { - check_serialization( - &Options::builder().model(Model::General).build(), - "model=general", - ); - - check_serialization( - &Options::builder() - .model(Model::CustomId(String::from("extra_crispy"))) - .build(), - "model=extra_crispy", - ); - } - - #[test] - fn version() { - check_serialization( - &Options::builder().version("1.2.3").build(), - "version=1.2.3", - ); - } - - #[test] - fn language() { - check_serialization( - &Options::builder().language(Language::en_US).build(), - "language=en-US", - ); - - check_serialization( - &Options::builder().language(Language::ja).build(), - "language=ja", - ); - } - - #[test] - fn punctuate() { - check_serialization( - &Options::builder().punctuate(true).build(), - "punctuate=true", - ); - - check_serialization( - &Options::builder().punctuate(false).build(), - "punctuate=false", - ); - } - - #[test] - fn profanity_filter() { - check_serialization( - &Options::builder().profanity_filter(true).build(), - "profanity_filter=true", - ); - - check_serialization( - &Options::builder().profanity_filter(false).build(), - "profanity_filter=false", - ); - } - - #[test] - fn redact() { - check_serialization(&Options::builder().redact([]).build(), ""); - - check_serialization( - &Options::builder().redact([Redact::Numbers]).build(), - "redact=numbers", - ); - - check_serialization( - &Options::builder() - .redact([Redact::Ssn, Redact::Pci]) - .build(), - "redact=ssn&redact=pci", - ); - - check_serialization( - &Options::builder() - .redact([ - Redact::Numbers, - Redact::Ssn, - Redact::Pci, - Redact::Ssn, - Redact::Numbers, - Redact::Pci, - ]) - .build(), - "redact=numbers&redact=ssn&redact=pci&redact=ssn&redact=numbers&redact=pci", - ); - } - - #[test] - fn diarize() { - check_serialization(&Options::builder().diarize(true).build(), "diarize=true"); - - check_serialization(&Options::builder().diarize(false).build(), "diarize=false"); - } - - #[test] - fn ner() { - check_serialization(&Options::builder().ner(true).build(), "ner=true"); - - check_serialization(&Options::builder().ner(false).build(), "ner=false"); - } - - #[test] - fn multichannel() { - check_serialization( - &Options::builder().multichannel(true).build(), - "multichannel=true", - ); - - check_serialization( - &Options::builder().multichannel(false).build(), - "multichannel=false", - ); - - check_serialization( - &Options::builder() - .multichannel_with_models([ - Model::Finance, - Model::CustomId(String::from("extra_crispy")), - Model::Conversationalai, - ]) - .build(), - "model=finance%3Aextra_crispy%3Aconversationalai&multichannel=true", - ); - } - - #[test] - fn alternatives() { - check_serialization( - &Options::builder().alternatives(4).build(), - "alternatives=4", - ); - } - - #[test] - fn numerals() { - check_serialization(&Options::builder().numerals(true).build(), "numerals=true"); - - check_serialization( - &Options::builder().numerals(false).build(), - "numerals=false", - ); - } - - #[test] - fn search() { - check_serialization(&Options::builder().search([]).build(), ""); - - check_serialization(&Options::builder().search(["Rust"]).build(), "search=Rust"); - - check_serialization( - &Options::builder().search(["Rust", "Deepgram"]).build(), - "search=Rust&search=Deepgram", - ); - - { - let (input, expected) = generate_alphabet_test("search", 25); - check_serialization(&Options::builder().search(input).build(), &expected); - } - } - - #[test] - fn replace() { - check_serialization(&Options::builder().replace([]).build(), ""); - - check_serialization( - &Options::builder() - .replace([Replace { - find: String::from("Aaron"), - replace: Some(String::from("Erin")), - }]) - .build(), - "replace=Aaron%3AErin", - ); - - check_serialization( - &Options::builder() - .replace([Replace { - find: String::from("Voldemort"), - replace: None, - }]) - .build(), - "replace=Voldemort", - ); - - check_serialization( - &Options::builder() - .replace([ - Replace { - find: String::from("Aaron"), - replace: Some(String::from("Erin")), - }, - Replace { - find: String::from("Voldemort"), - replace: None, - }, - ]) - .build(), - "replace=Aaron%3AErin&replace=Voldemort", - ); - - check_serialization( - &Options::builder() - .replace([Replace { - find: String::from("this too"), - replace: Some(String::from("that too")), - }]) - .build(), - "replace=this+too%3Athat+too", - ); - } - - #[test] - fn keywords() { - check_serialization(&Options::builder().keywords([]).build(), ""); - - check_serialization( - &Options::builder().keywords(["Ferris"]).build(), - "keywords=Ferris", - ); - - check_serialization( - &Options::builder().keywords(["Ferris", "Cargo"]).build(), - "keywords=Ferris&keywords=Cargo", - ); - - { - let (input, expected) = generate_alphabet_test("keywords", 200); - - check_serialization(&Options::builder().keywords(input).build(), &expected); - } - - { - let keywords = [Keyword { - keyword: String::from("Ferris"), - intensifier: Some(0.5), - }]; - - check_serialization( - &Options::builder() - .keywords_with_intensifiers(keywords) - .build(), - "keywords=Ferris%3A0.5", - ); - } - - { - let keywords = [ - Keyword { - keyword: String::from("Ferris"), - intensifier: Some(0.5), - }, - Keyword { - keyword: String::from("Cargo"), - intensifier: Some(-1.5), - }, - ]; - - check_serialization( - &Options::builder() - .keywords_with_intensifiers(keywords) - .build(), - "keywords=Ferris%3A0.5&keywords=Cargo%3A-1.5", - ); - } - - check_serialization( - &Options::builder() - .keywords(["Ferris"]) - .keyword_boost_legacy() - .build(), - "keywords=Ferris&keyword_boost=legacy", - ); - } - - #[test] - fn utterances() { - check_serialization( - &Options::builder().utterances(false).build(), - "utterances=false", - ); - - check_serialization( - &Options::builder().utterances(true).build(), - "utterances=true", - ); - - check_serialization( - &Options::builder().utterances_with_utt_split(0.9).build(), - "utterances=true&utt_split=0.9", - ); - } - - #[test] - fn tag() { - check_serialization(&Options::builder().tag(["Tag 1"]).build(), "tag=Tag+1"); - - check_serialization( - &Options::builder().tag(["Tag 1", "Tag 2"]).build(), - "tag=Tag+1&tag=Tag+2", - ); - } - - #[test] - fn detect_language() { - check_serialization( - &Options::builder().detect_language(false).build(), - "detect_language=false", - ); - - check_serialization( - &Options::builder().detect_language(true).build(), - "detect_language=true", - ); - } -} diff --git a/deepgram-rust-sdk/src/transcription/prerecorded/response.rs b/deepgram-rust-sdk/src/transcription/prerecorded/response.rs deleted file mode 100644 index 4d04adb..0000000 --- a/deepgram-rust-sdk/src/transcription/prerecorded/response.rs +++ /dev/null @@ -1,237 +0,0 @@ -//! Deepgram pre-recorded transcription API response types. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded-responses - -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -/// Returned by [`Transcription::prerecorded`](crate::transcription::Transcription::prerecorded). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Response { - #[allow(missing_docs)] - pub metadata: ListenMetadata, - - #[allow(missing_docs)] - pub results: ListenResults, -} - -/// Returned by [`Transcription::prerecorded_callback`](crate::transcription::Transcription::prerecorded_callback). -/// -/// See the [Deepgram Callback feature docs][docs] for more info. -/// -/// [docs]: https://developers.deepgram.com/documentation/features/callback/ -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct CallbackResponse { - #[allow(missing_docs)] - pub request_id: Uuid, -} - -/// Metadata about the transcription. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct ListenMetadata { - #[allow(missing_docs)] - pub request_id: Uuid, - - #[allow(missing_docs)] - pub transaction_key: String, - - #[allow(missing_docs)] - pub sha256: String, - - #[allow(missing_docs)] - pub created: String, - - #[allow(missing_docs)] - pub duration: f64, - - #[allow(missing_docs)] - pub channels: usize, -} - -/// Transcription results. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct ListenResults { - #[allow(missing_docs)] - pub channels: Vec, - - /// [`None`] unless the [Utterances feature][docs] is set. - /// Features can be set using an [`OptionsBuilder`](`super::options::OptionsBuilder`). - /// - /// [docs]: https://developers.deepgram.com/documentation/features/utterances/ - pub utterances: Option>, -} - -/// Transcription results for a single audio channel. -/// -/// See the [Deepgram API Reference][api] -/// and the [Deepgram Multichannel feature docs][docs] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded -/// [docs]: https://developers.deepgram.com/documentation/features/multichannel/ -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct ChannelResult { - /// [`None`] unless the [Search feature][docs] is set. - /// Features can be set using an [`OptionsBuilder`](`super::options::OptionsBuilder`). - /// - /// [docs]: https://developers.deepgram.com/documentation/features/search/ - pub search: Option>, - - #[allow(missing_docs)] - pub alternatives: Vec, - - /// [BCP-47][bcp47] language tag for the dominant language identified in the channel. - /// - /// [`None`] unless the [Language Detection feature][docs] is set. - /// Features can be set using an [`OptionsBuilder`](`super::options::OptionsBuilder`). - /// - /// [bcp47]: https://tools.ietf.org/html/bcp47 - /// [docs]: https://developers.deepgram.com/docs/language-detection/ - pub detected_language: Option, -} - -/// Transcription results for a single utterance. -/// -/// See the [Deepgram Utterance feature docs][docs] for more info. -/// -/// [docs]: https://developers.deepgram.com/documentation/features/utterances/ -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Utterance { - #[allow(missing_docs)] - pub start: f64, - - #[allow(missing_docs)] - pub end: f64, - - #[allow(missing_docs)] - pub confidence: f64, - - #[allow(missing_docs)] - pub channel: usize, - - #[allow(missing_docs)] - pub transcript: String, - - #[allow(missing_docs)] - pub words: Vec, - - /// [`None`] unless the [Diarization feature][docs] is set. - /// Features can be set using an [`OptionsBuilder`](`super::options::OptionsBuilder`). - /// - /// [docs]: https://developers.deepgram.com/documentation/features/diarize/ - pub speaker: Option, - - #[allow(missing_docs)] - pub id: Uuid, -} - -/// Search results. -/// -/// See the [Deepgram API Reference][api] -/// and the [Deepgram Search feature docs][docs] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded -/// [docs]: https://developers.deepgram.com/documentation/features/search/ -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct SearchResults { - #[allow(missing_docs)] - pub query: String, - - #[allow(missing_docs)] - pub hits: Vec, -} - -/// Transcript alternatives. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct ResultAlternative { - #[allow(missing_docs)] - pub transcript: String, - - #[allow(missing_docs)] - pub confidence: f64, - - #[allow(missing_docs)] - pub words: Vec, -} - -/// A single transcribed word. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Word { - #[allow(missing_docs)] - pub word: String, - - #[allow(missing_docs)] - pub start: f64, - - #[allow(missing_docs)] - pub end: f64, - - #[allow(missing_docs)] - pub confidence: f64, - - /// [`None`] unless the [Diarization feature][docs] is set. - /// Features can be set using an [`OptionsBuilder`](`super::options::OptionsBuilder`). - /// - /// [docs]: https://developers.deepgram.com/documentation/features/diarize/ - pub speaker: Option, - pub speaker_confidence: Option, - - /// [`None`] unless the [Punctuation feature][docs] is set. - /// Features can be set using an [`OptionsBuilder`](`super::options::OptionsBuilder`). - /// - /// [docs]: https://developers.deepgram.com/documentation/features/punctuate/ - pub punctuated_word: Option, -} - -/// Search result. -/// -/// See the [Deepgram API Reference][api] -/// and the [Deepgram Search feature docs][docs] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#transcription-prerecorded -/// [docs]: https://developers.deepgram.com/documentation/features/search/ -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Hit { - #[allow(missing_docs)] - pub confidence: f64, - - #[allow(missing_docs)] - pub start: f64, - - #[allow(missing_docs)] - pub end: f64, - - #[allow(missing_docs)] - pub snippet: String, -} diff --git a/deepgram-rust-sdk/src/usage.rs b/deepgram-rust-sdk/src/usage.rs deleted file mode 100644 index ad99a63..0000000 --- a/deepgram-rust-sdk/src/usage.rs +++ /dev/null @@ -1,242 +0,0 @@ -//! Get the usage data of a Deepgram Project. -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#usage - -use crate::{send_and_translate_response, Deepgram}; - -pub mod get_fields_options; -pub mod get_usage_options; -pub mod list_requests_options; -pub mod response; - -use response::{Fields, Request, Requests, UsageSummary}; - -/// Get the usage data of a Deepgram Project. -/// -/// Constructed using [`Deepgram::usage`]. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage -#[derive(Debug, Clone)] -pub struct Usage<'a>(&'a Deepgram); - -impl Deepgram { - /// Construct a new [`Usage`] from a [`Deepgram`]. - pub fn usage(&self) -> Usage<'_> { - self.into() - } -} - -impl<'a> From<&'a Deepgram> for Usage<'a> { - /// Construct a new [`Usage`] from a [`Deepgram`]. - fn from(deepgram: &'a Deepgram) -> Self { - Self(deepgram) - } -} - -impl Usage<'_> { - /// Get all requests sent to the Deepgram API for the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#usage-all - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{ - /// # usage::{get_fields_options, get_usage_options, list_requests_options}, - /// # Deepgram, DeepgramError, - /// # }; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let options = list_requests_options::Options::builder().build(); - /// let requests = dg_client - /// .usage() - /// .list_requests(&project_id, &options) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn list_requests( - &self, - project_id: &str, - options: &list_requests_options::Options, - ) -> crate::Result { - let url = format!( - "https://api.deepgram.com/v1/projects/{}/requests", - project_id, - ); - let request = self - .0 - .client - .get(url) - .query(&list_requests_options::SerializableOptions::from(options)); - - send_and_translate_response(request).await - } - - /// Get the details of the specified request sent to the Deepgram API for the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#usage-get - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{ - /// # usage::{get_fields_options, get_usage_options, list_requests_options}, - /// # Deepgram, DeepgramError, - /// # }; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// # let request_id = - /// # env::var("DEEPGRAM_REQUEST_ID").expect("DEEPGRAM_REQUEST_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let request = dg_client - /// .usage() - /// .get_request(&project_id, &request_id) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn get_request(&self, project_id: &str, request_id: &str) -> crate::Result { - let url = format!( - "https://api.deepgram.com/v1/projects/{}/requests/{}", - project_id, request_id, - ); - - send_and_translate_response(self.0.client.get(url)).await - } - - /// Get a summary of usage statistics. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#usage-summary - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{ - /// # usage::{get_fields_options, get_usage_options, list_requests_options}, - /// # Deepgram, DeepgramError, - /// # }; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let options = get_usage_options::Options::builder().build(); - /// let summary = dg_client - /// .usage() - /// .get_usage(&project_id, &options) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn get_usage( - &self, - project_id: &str, - options: &get_usage_options::Options, - ) -> crate::Result { - let url = format!("https://api.deepgram.com/v1/projects/{}/usage", project_id); - let request = self - .0 - .client - .get(url) - .query(&get_usage_options::SerializableOptions::from(options)); - - send_and_translate_response(request).await - } - - /// Get the features, models, tags, languages, and processing method used for requests in the specified project. - /// - /// See the [Deepgram API Reference][api] for more info. - /// - /// [api]: https://developers.deepgram.com/api-reference/#usage-fields - /// - /// # Examples - /// - /// ```no_run - /// # use std::env; - /// # - /// # use deepgram::{ - /// # usage::{get_fields_options, get_usage_options, list_requests_options}, - /// # Deepgram, DeepgramError, - /// # }; - /// # - /// # #[tokio::main] - /// # async fn main() -> Result<(), DeepgramError> { - /// # let deepgram_api_key = - /// # env::var("DEEPGRAM_API_KEY").expect("DEEPGRAM_API_KEY environmental variable"); - /// # - /// # let project_id = - /// # env::var("DEEPGRAM_PROJECT_ID").expect("DEEPGRAM_PROJECT_ID environmental variable"); - /// # - /// let dg_client = Deepgram::new(&deepgram_api_key); - /// - /// let options = get_fields_options::Options::builder().build(); - /// let summary = dg_client - /// .usage() - /// .get_fields(&project_id, &options) - /// .await?; - /// # - /// # Ok(()) - /// # } - /// ``` - pub async fn get_fields( - &self, - project_id: &str, - options: &get_fields_options::Options, - ) -> crate::Result { - let url = format!( - "https://api.deepgram.com/v1/projects/{}/usage/fields", - project_id, - ); - let request = self - .0 - .client - .get(url) - .query(&get_fields_options::SerializableOptions::from(options)); - - send_and_translate_response(request).await - } -} diff --git a/deepgram-rust-sdk/src/usage/get_fields_options.rs b/deepgram-rust-sdk/src/usage/get_fields_options.rs deleted file mode 100644 index edbfdd7..0000000 --- a/deepgram-rust-sdk/src/usage/get_fields_options.rs +++ /dev/null @@ -1,102 +0,0 @@ -//! Set options for [`Usage::get_fields`](super::Usage::get_fields). -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#usage-fields - -use serde::Serialize; - -/// Used as a parameter for [`Usage::get_fields`](super::Usage::get_fields). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-fields -#[derive(Debug, PartialEq, Clone)] -pub struct Options { - start: Option, - end: Option, -} - -/// Builds an [`Options`] object using [the Builder pattern][builder]. -/// -/// [builder]: https://rust-unofficial.github.io/patterns/patterns/creational/builder.html -#[derive(Debug, PartialEq, Clone)] -pub struct OptionsBuilder(Options); - -#[derive(Serialize)] -pub(super) struct SerializableOptions<'a> { - #[serde(skip_serializing_if = "Option::is_none")] - start: &'a Option, - - #[serde(skip_serializing_if = "Option::is_none")] - end: &'a Option, -} - -impl Options { - /// Construct a new [`OptionsBuilder`]. - pub fn builder() -> OptionsBuilder { - OptionsBuilder::new() - } -} - -impl OptionsBuilder { - /// Construct a new [`OptionsBuilder`]. - pub fn new() -> Self { - Self(Options { - start: None, - end: None, - }) - } - - /// Set the time range start date. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::list_requests_options::Options; - /// # - /// let options1 = Options::builder() - /// .start("1970-01-01") - /// .build(); - /// ``` - pub fn start(mut self, start: impl Into) -> Self { - self.0.start = Some(start.into()); - self - } - - /// Set the time range end date. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::list_requests_options::Options; - /// # - /// let options1 = Options::builder() - /// .end("2038-01-19") - /// .build(); - /// ``` - pub fn end(mut self, end: impl Into) -> Self { - self.0.end = Some(end.into()); - self - } - - /// Finish building the [`Options`] object. - pub fn build(self) -> Options { - self.0 - } -} - -impl Default for OptionsBuilder { - fn default() -> Self { - Self::new() - } -} - -impl<'a> From<&'a Options> for SerializableOptions<'a> { - fn from(options: &'a Options) -> Self { - // Destructuring it makes sure that we don't forget to use any of it - let Options { start, end } = options; - - Self { start, end } - } -} diff --git a/deepgram-rust-sdk/src/usage/get_usage_options.rs b/deepgram-rust-sdk/src/usage/get_usage_options.rs deleted file mode 100644 index c5529c1..0000000 --- a/deepgram-rust-sdk/src/usage/get_usage_options.rs +++ /dev/null @@ -1,599 +0,0 @@ -//! Set options for [`Usage::get_usage`](super::Usage::get_usage). -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#usage-summary - -use serde::{ser::SerializeSeq, Serialize}; - -/// Used as a parameter for [`Usage::get_usage`](super::Usage::get_usage). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-summary -#[derive(Debug, PartialEq, Clone)] -pub struct Options { - start: Option, - end: Option, - accessor: Option, - tags: Vec, - methods: Vec, - models: Vec, - multichannel: Option, - interim_results: Option, - punctuate: Option, - ner: Option, - utterances: Option, - replace: Option, - profanity_filter: Option, - keywords: Option, - diarize: Option, - search: Option, - redact: Option, - alternatives: Option, - numerals: Option, -} - -/// Used as a parameter for [`OptionsBuilder::method`]. -#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)] -#[non_exhaustive] -pub enum Method { - #[allow(missing_docs)] - Sync, - - #[allow(missing_docs)] - Async, - - #[allow(missing_docs)] - Streaming, -} - -/// Builds an [`Options`] object using [the Builder pattern][builder]. -/// -/// [builder]: https://rust-unofficial.github.io/patterns/patterns/creational/builder.html -#[derive(Debug, PartialEq, Clone)] -pub struct OptionsBuilder(Options); - -pub(super) struct SerializableOptions<'a>(&'a Options); - -impl Options { - /// Construct a new [`OptionsBuilder`]. - pub fn builder() -> OptionsBuilder { - OptionsBuilder::new() - } -} - -impl OptionsBuilder { - /// Construct a new [`OptionsBuilder`]. - pub fn new() -> Self { - Self(Options { - start: None, - end: None, - accessor: None, - tags: Vec::new(), - methods: Vec::new(), - models: Vec::new(), - multichannel: None, - interim_results: None, - punctuate: None, - ner: None, - utterances: None, - replace: None, - profanity_filter: None, - keywords: None, - diarize: None, - search: None, - redact: None, - alternatives: None, - numerals: None, - }) - } - - /// Set the time range start date. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .start("1970-01-01") - /// .build(); - /// ``` - pub fn start(mut self, start: impl Into) -> Self { - self.0.start = Some(start.into()); - self - } - - /// Set the time range end date. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .end("2038-01-19") - /// .build(); - /// ``` - pub fn end(mut self, end: impl Into) -> Self { - self.0.end = Some(end.into()); - self - } - - /// Limits results to requests made using the API key corresponding to the given accessor. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .accessor("12345678-1234-1234-1234-1234567890ab") - /// .build(); - /// ``` - pub fn accessor(mut self, accessor: impl Into) -> Self { - self.0.accessor = Some(accessor.into()); - self - } - - /// Limits results to requests associated with the specified tag. - /// - /// Calling this when already set will append to the existing tags, not overwrite them. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .tag(["Tag 1", "Tag 2"]) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options1 = Options::builder() - /// .tag(["Tag 1"]) - /// .tag(["Tag 2"]) - /// .build(); - /// - /// let options2 = Options::builder() - /// .tag(["Tag 1", "Tag 2"]) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn tag<'a>(mut self, tag: impl IntoIterator) -> Self { - self.0.tags.extend(tag.into_iter().map(String::from)); - self - } - - /// Limits results to requests processed using the specified method. - /// - /// Calling this when already set will append to the existing methods, not overwrite them. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::{Method, Options}; - /// # - /// let options = Options::builder() - /// .method([Method::Sync, Method::Streaming]) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::usage::get_usage_options::{Method, Options}; - /// # - /// let options1 = Options::builder() - /// .method([Method::Sync]) - /// .method([Method::Streaming]) - /// .build(); - /// - /// let options2 = Options::builder() - /// .method([Method::Sync, Method::Streaming]) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn method(mut self, method: impl IntoIterator) -> Self { - self.0.methods.extend(method); - self - } - - /// Limits results to requests run with the specified model UUID applied. - /// - /// Calling this when already set will append to the models, not overwrite them. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .model([ - /// "4899aa60-f723-4517-9815-2042acc12a82", - /// "125125fb-e391-458e-a227-a60d6426f5d6", - /// ]) - /// .build(); - /// ``` - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options1 = Options::builder() - /// .model(["4899aa60-f723-4517-9815-2042acc12a82"]) - /// .model(["125125fb-e391-458e-a227-a60d6426f5d6"]) - /// .build(); - /// - /// let options2 = Options::builder() - /// .model([ - /// "4899aa60-f723-4517-9815-2042acc12a82", - /// "125125fb-e391-458e-a227-a60d6426f5d6", - /// ]) - /// .build(); - /// - /// assert_eq!(options1, options2); - /// ``` - pub fn model<'a>(mut self, model: impl IntoIterator) -> Self { - self.0.models.extend(model.into_iter().map(String::from)); - self - } - - /// Limits results to requests that include the Multichannel feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .multichannel(true) - /// .build(); - /// ``` - pub fn multichannel(mut self, multichannel: bool) -> Self { - self.0.multichannel = Some(multichannel); - self - } - - /// Limits results to requests that include the Interim Results feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .interim_results(true) - /// .build(); - /// ``` - pub fn interim_results(mut self, interim_results: bool) -> Self { - self.0.interim_results = Some(interim_results); - self - } - - /// Limits results to requests that include the Punctuation feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .punctuate(true) - /// .build(); - /// ``` - pub fn punctuate(mut self, punctuate: bool) -> Self { - self.0.punctuate = Some(punctuate); - self - } - - /// Limits results to requests that include the Named-Entity Recognition feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .ner(true) - /// .build(); - /// ``` - pub fn ner(mut self, ner: bool) -> Self { - self.0.ner = Some(ner); - self - } - - /// Limits results to requests that include the Utterances feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .utterances(true) - /// .build(); - /// ``` - pub fn utterances(mut self, utterances: bool) -> Self { - self.0.utterances = Some(utterances); - self - } - - /// Limits results to requests that include the Replace feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .replace(true) - /// .build(); - /// ``` - pub fn replace(mut self, replace: bool) -> Self { - self.0.replace = Some(replace); - self - } - - /// Limits results to requests that include the Profanity Filter feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .profanity_filter(true) - /// .build(); - /// ``` - pub fn profanity_filter(mut self, profanity_filter: bool) -> Self { - self.0.profanity_filter = Some(profanity_filter); - self - } - - /// Limits results to requests that include the Keywords feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .keywords(true) - /// .build(); - /// ``` - pub fn keywords(mut self, keywords: bool) -> Self { - self.0.keywords = Some(keywords); - self - } - - /// Limits results to requests that include the Diarization feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .diarize(true) - /// .build(); - /// ``` - pub fn diarize(mut self, diarize: bool) -> Self { - self.0.diarize = Some(diarize); - self - } - - /// Limits results to requests that include the Search feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .search(true) - /// .build(); - /// ``` - pub fn search(mut self, search: bool) -> Self { - self.0.search = Some(search); - self - } - - /// Limits results to requests that include the Redaction feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .redact(true) - /// .build(); - /// ``` - pub fn redact(mut self, redact: bool) -> Self { - self.0.redact = Some(redact); - self - } - - /// Limits results to requests that include the Alternatives feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .alternatives(true) - /// .build(); - /// ``` - pub fn alternatives(mut self, alternatives: bool) -> Self { - self.0.alternatives = Some(alternatives); - self - } - - /// Limits results to requests that include the Numerals feature. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::get_usage_options::Options; - /// # - /// let options = Options::builder() - /// .numerals(true) - /// .build(); - /// ``` - pub fn numerals(mut self, numerals: bool) -> Self { - self.0.numerals = Some(numerals); - self - } - - /// Finish building the [`Options`] object. - pub fn build(self) -> Options { - self.0 - } -} - -impl Default for OptionsBuilder { - fn default() -> Self { - Self::new() - } -} - -impl<'a> From<&'a Options> for SerializableOptions<'a> { - fn from(options: &'a Options) -> Self { - Self(options) - } -} - -impl Serialize for SerializableOptions<'_> { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - let mut seq = serializer.serialize_seq(None)?; - - // Destructuring it makes sure that we don't forget to use any of it - let Options { - start, - end, - accessor, - tags, - methods, - models, - multichannel, - interim_results, - punctuate, - ner, - utterances, - replace, - profanity_filter, - keywords, - diarize, - search, - redact, - alternatives, - numerals, - } = self.0; - - if let Some(start) = start { - seq.serialize_element(&("start", start))?; - } - - if let Some(end) = end { - seq.serialize_element(&("end", end))?; - } - - if let Some(accessor) = accessor { - seq.serialize_element(&("accessor", accessor))?; - } - - for element in tags { - seq.serialize_element(&("tag", element))?; - } - - for element in methods { - seq.serialize_element(&("method", AsRef::::as_ref(element)))?; - } - - for element in models { - seq.serialize_element(&("model", element))?; - } - - if let Some(multichannel) = multichannel { - seq.serialize_element(&("multichannel", multichannel))?; - } - - if let Some(interim_results) = interim_results { - seq.serialize_element(&("interim_results", interim_results))?; - } - - if let Some(punctuate) = punctuate { - seq.serialize_element(&("punctuate", punctuate))?; - } - - if let Some(ner) = ner { - seq.serialize_element(&("ner", ner))?; - } - - if let Some(utterances) = utterances { - seq.serialize_element(&("utterances", utterances))?; - } - - if let Some(replace) = replace { - seq.serialize_element(&("replace", replace))?; - } - - if let Some(replace) = replace { - seq.serialize_element(&("replace", replace))?; - } - - if let Some(profanity_filter) = profanity_filter { - seq.serialize_element(&("profanity_filter", profanity_filter))?; - } - - if let Some(keywords) = keywords { - seq.serialize_element(&("keywords", keywords))?; - } - - if let Some(diarize) = diarize { - seq.serialize_element(&("diarize", diarize))?; - } - - if let Some(search) = search { - seq.serialize_element(&("search", search))?; - } - - if let Some(redact) = redact { - seq.serialize_element(&("redact", redact))?; - } - - if let Some(alternatives) = alternatives { - seq.serialize_element(&("alternatives", alternatives))?; - } - - if let Some(numerals) = numerals { - seq.serialize_element(&("numerals", numerals))?; - } - - seq.end() - } -} - -impl AsRef for Method { - fn as_ref(&self) -> &str { - use Method::*; - - match self { - Sync => "sync", - Async => "async", - Streaming => "streaming", - } - } -} - -mod serialize_options_tests { - // TODO -} diff --git a/deepgram-rust-sdk/src/usage/list_requests_options.rs b/deepgram-rust-sdk/src/usage/list_requests_options.rs deleted file mode 100644 index c66a05f..0000000 --- a/deepgram-rust-sdk/src/usage/list_requests_options.rs +++ /dev/null @@ -1,169 +0,0 @@ -//! Set options for [`Usage::list_requests`](super::Usage::list_requests). -//! -//! See the [Deepgram API Reference][api] for more info. -//! -//! [api]: https://developers.deepgram.com/api-reference/#usage-all - -use serde::Serialize; - -/// Used as a parameter for [`Usage::list_requests`](super::Usage::list_requests). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-all -#[derive(Debug, PartialEq, Clone)] -pub struct Options { - start: Option, - end: Option, - limit: Option, - status: Option, -} - -/// Used as a parameter for [`OptionsBuilder::status`]. -#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)] -#[non_exhaustive] -pub enum Status { - #[allow(missing_docs)] - Succeeded, - - #[allow(missing_docs)] - Failed, -} - -/// Builds an [`Options`] object using [the Builder pattern][builder]. -/// -/// [builder]: https://rust-unofficial.github.io/patterns/patterns/creational/builder.html -#[derive(Debug, PartialEq, Clone)] -pub struct OptionsBuilder(Options); - -#[derive(Serialize)] -pub(super) struct SerializableOptions<'a> { - #[serde(skip_serializing_if = "Option::is_none")] - start: &'a Option, - - #[serde(skip_serializing_if = "Option::is_none")] - end: &'a Option, - - #[serde(skip_serializing_if = "Option::is_none")] - limit: Option, - - #[serde(skip_serializing_if = "Option::is_none")] - status: Option<&'static str>, -} - -impl Options { - /// Construct a new [`OptionsBuilder`]. - pub fn builder() -> OptionsBuilder { - OptionsBuilder::new() - } -} - -impl OptionsBuilder { - /// Construct a new [`OptionsBuilder`]. - pub fn new() -> Self { - Self(Options { - start: None, - end: None, - limit: None, - status: None, - }) - } - - /// Set the time range start date. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::list_requests_options::Options; - /// # - /// let options1 = Options::builder() - /// .start("1970-01-01") - /// .build(); - /// ``` - pub fn start(mut self, start: impl Into) -> Self { - self.0.start = Some(start.into()); - self - } - - /// Set the time range end date. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::list_requests_options::Options; - /// # - /// let options1 = Options::builder() - /// .end("2038-01-19") - /// .build(); - /// ``` - pub fn end(mut self, end: impl Into) -> Self { - self.0.end = Some(end.into()); - self - } - - /// Set the maximum number of results to return per page. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::list_requests_options::Options; - /// # - /// let options1 = Options::builder() - /// .limit(42) - /// .build(); - /// ``` - pub fn limit(mut self, limit: usize) -> Self { - self.0.limit = Some(limit); - self - } - - /// Limits results to requests to requests that either succeeded or failed. - /// - /// # Examples - /// - /// ``` - /// # use deepgram::usage::list_requests_options::{Options, Status}; - /// # - /// let options1 = Options::builder() - /// .status(Status::Succeeded) - /// .build(); - /// ``` - pub fn status(mut self, status: Status) -> Self { - self.0.status = Some(status); - self - } - - /// Finish building the [`Options`] object. - pub fn build(self) -> Options { - self.0 - } -} - -impl Default for OptionsBuilder { - fn default() -> Self { - Self::new() - } -} - -impl<'a> From<&'a Options> for SerializableOptions<'a> { - fn from(options: &'a Options) -> Self { - // Destructuring it makes sure that we don't forget to use any of it - let Options { - start, - end, - limit, - status, - } = options; - - Self { - start, - end, - limit: *limit, - status: match status { - Some(Status::Succeeded) => Some("succeeded"), - Some(Status::Failed) => Some("failed"), - None => None, - }, - } - } -} diff --git a/deepgram-rust-sdk/src/usage/response.rs b/deepgram-rust-sdk/src/usage/response.rs deleted file mode 100644 index 8e77aba..0000000 --- a/deepgram-rust-sdk/src/usage/response.rs +++ /dev/null @@ -1,282 +0,0 @@ -//! Deepgram usage API response types. - -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -/// Returned by [`Usage::list_requests`](super::Usage::list_requests). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-all -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Requests { - #[allow(missing_docs)] - pub page: usize, - - #[allow(missing_docs)] - pub limit: usize, - - #[allow(missing_docs)] - pub requests: Vec, -} - -/// Returned by [`Usage::get_request`](super::Usage::get_request). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-get -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Request { - #[allow(missing_docs)] - pub request_id: Uuid, - - #[allow(missing_docs)] - pub created: String, - - #[allow(missing_docs)] - pub path: String, - - #[allow(missing_docs)] - pub api_key_id: Uuid, - - #[allow(missing_docs)] - pub response: Option, - - #[allow(missing_docs)] - pub callback: Option, -} - -/// The response generated by the request. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-get -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Response { - #[allow(missing_docs)] - pub details: Option
, - - #[allow(missing_docs)] - pub message: Option, - - #[allow(missing_docs)] - pub code: i16, - - #[allow(missing_docs)] - pub completed: String, -} - -/// Details about the request. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-get -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Details { - #[allow(missing_docs)] - pub usd: Option, - - #[allow(missing_docs)] - pub duration: f64, - - #[allow(missing_docs)] - pub total_audio: f64, - - #[allow(missing_docs)] - pub channels: usize, - - #[allow(missing_docs)] - pub streams: usize, - - #[allow(missing_docs)] - pub models: Vec, - - #[allow(missing_docs)] - pub method: String, - - #[allow(missing_docs)] - pub tags: Vec, - - #[allow(missing_docs)] - pub features: Vec, - - #[allow(missing_docs)] - pub config: Config, -} - -/// Configuration used when running the request. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-get -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Config { - #[allow(missing_docs)] - pub alternatives: Option, - - #[allow(missing_docs)] - pub diarize: Option, - - #[allow(missing_docs)] - pub keywords: Option>, - - #[allow(missing_docs)] - pub language: Option, - - #[allow(missing_docs)] - pub model: Option, - - #[allow(missing_docs)] - pub tier: Option, - - #[allow(missing_docs)] - pub multichannel: Option, - - #[allow(missing_docs)] - pub ner: Option, - - #[allow(missing_docs)] - pub numerals: Option, - - #[allow(missing_docs)] - pub profanity_filter: Option, - - #[allow(missing_docs)] - pub punctuate: Option, - - #[allow(missing_docs)] - pub redact: Option>, - - #[allow(missing_docs)] - pub search: Option>, - - #[allow(missing_docs)] - pub utterances: Option, -} - -/// Details about a callback request. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-get -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Callback { - #[allow(missing_docs)] - pub attempts: usize, - - #[allow(missing_docs)] - pub code: Option, - - #[allow(missing_docs)] - pub completed: Option, -} - -/// Returned by [`Usage::get_usage`](super::Usage::get_usage). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-summary -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct UsageSummary { - #[allow(missing_docs)] - pub start: String, - - #[allow(missing_docs)] - pub end: String, - - #[allow(missing_docs)] - pub resolution: Resolution, - - #[allow(missing_docs)] - pub results: Vec, -} - -/// The amount of time covered by each [`Result`]. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-summary -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Resolution { - #[allow(missing_docs)] - pub units: String, - - #[allow(missing_docs)] - pub amount: usize, -} - -/// A summary of the usage over a period of time. -/// -/// The resolution of each result is defined in [`UsageSummary::resolution`]. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-summary -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Result { - #[allow(missing_docs)] - pub start: String, - - #[allow(missing_docs)] - pub end: String, - - #[allow(missing_docs)] - pub hours: f64, - - #[allow(missing_docs)] - pub total_hours: f64, - - #[allow(missing_docs)] - pub requests: usize, -} - -/// Returned by [`Usage::get_fields`](super::Usage::get_fields). -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-fields -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Fields { - #[allow(missing_docs)] - pub tags: Vec, - - #[allow(missing_docs)] - pub models: Vec, - - #[allow(missing_docs)] - pub processing_methods: Vec, - - #[allow(missing_docs)] - pub features: Vec, -} - -/// Details about the model used. -/// -/// See the [Deepgram API Reference][api] for more info. -/// -/// [api]: https://developers.deepgram.com/api-reference/#usage-fields -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -#[non_exhaustive] -pub struct Model { - #[allow(missing_docs)] - pub name: String, - - #[allow(missing_docs)] - pub language: String, - - #[allow(missing_docs)] - pub version: String, - - #[allow(missing_docs)] - pub model_id: Uuid, -} diff --git a/src/main.rs b/src/main.rs index 7b69ccf..83f87ad 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,15 +8,6 @@ use bytes::{BufMut, Bytes, BytesMut}; use cpal::traits::{DeviceTrait, HostTrait, StreamTrait}; use cpal::Sample; use crossbeam::channel::RecvError; -use deepgram::transcription::live::{Alternatives, Channel, Word as LiveWord}; -use deepgram::transcription::prerecorded::response::Word as PrerecordedWord; -use deepgram::{ - transcription::prerecorded::{ - audio_source::AudioSource, - options::{Language, Options}, - }, - Deepgram, DeepgramError, -}; use egui::text::LayoutJob; use egui::*; use futures::channel::mpsc::{self, Receiver, Sender}; @@ -38,28 +29,6 @@ mod audiofile; mod self_update; mod session; -enum Word { - Live(LiveWord), - Prerecorded(PrerecordedWord), -} - -impl Word { - fn speaker(&self) -> usize { - match self { - Word::Live(word) => word.speaker as usize, - Word::Prerecorded(word) => word.speaker.unwrap(), - } - } - fn word(&self) -> &str { - match self { - Word::Live(word) => &word.word, - Word::Prerecorded(word) => &word.word, - } - } -} - -static TRANSCRIPT: Lazy>>> = Lazy::new(Default::default); -static TRANSCRIPT_FINAL: Lazy>>> = Lazy::new(Default::default); static DURATION: Lazy> = Lazy::new(Default::default); static COMPLETION: Lazy> = Lazy::new(Default::default); static COMPLETION_PROMPT: Lazy> = Lazy::new(|| { @@ -208,33 +177,6 @@ pub struct App { } impl App { - fn get_transcript(&self) -> String { - let mut transcript: String = String::new(); - - let words = TRANSCRIPT_FINAL.lock().unwrap(); - - let lines = words.split(|word| word.is_none()); - - for line in lines { - let mut current_speaker = 100; - - for word in line { - if let Some(word) = word { - if word.speaker() != current_speaker { - current_speaker = word.speaker(); - transcript.push_str(&format!( - "\n[{}]: ", - self.speaker_names.get(current_speaker).unwrap_or(&String::new()) - )); - } - transcript.push_str(&format!("{} ", word.word())); - } - } - } - transcript.push('\n'); - transcript - } - pub fn new(cc: &eframe::CreationContext<'_>) -> Self { cc.egui_ctx.set_visuals(egui::style::Visuals::dark()); cc.egui_ctx.style_mut(|s| s.visuals.override_text_color = Some(Color32::WHITE)); @@ -383,156 +325,6 @@ impl eframe::App for App { .changed() .then(|| setting2.save()); - for (i, session) in self.sessions.iter().enumerate() { - if ui.button(format!("Session {}: {} s", i, session.duration_ms() as f32 / 1000.0)).clicked() { - let samples = session.samples(); - - tokio::spawn(async move { - // clear transcript - TRANSCRIPT_FINAL.lock().unwrap().clear(); - - // dbg!(session.samples().len()); - audiofile::save_wav_file(samples); - - let dg_client = Deepgram::new(Setting::get("deepgram_api_key").value); - - let file = File::open("temp_audio.aac").await.unwrap(); - - let source = AudioSource::from_buffer_with_mime_type(file, "audio/aac"); - - let options = Options::builder() - .punctuate(false) - .diarize(true) - .model(deepgram::transcription::prerecorded::options::Model::CustomId( - "nova-2-meeting".to_string(), - )) - .build(); - - eprintln!("transcribing..."); - let response: deepgram::transcription::prerecorded::response::Response = dg_client - .transcription() - .make_prerecorded_request_builder(source, &options) - .query(&[("filler_words", "true")]) - .send() - .await - .unwrap() - .json() - .await - .unwrap(); - - // let response = dg_client.transcription().prerecorded(source, &options).await.unwrap(); - eprintln!("complete."); - // dbg!(&response); - - let transcript = &response.results.channels[0].alternatives[0].transcript; - println!("{}", transcript); - - let words = &response.results.channels[0].alternatives[0].words; - - for word in words.iter() { - TRANSCRIPT_FINAL.lock().unwrap().push(Some(Word::Prerecorded(word.clone()))); - } - }); - // samples is single-channel f32 little endian - // make into mp3 file - } - } - - if ui - .add_enabled( - !self.is_recording, - Button::new(if self.is_recording { "recording..." } else { "record" }), - ) - .clicked() - { - self.is_recording = true; - self.sessions.push(session::Session { start_ms: now_ms(), end_ms: i64::MAX }); - tokio::spawn(async { - println!("transcription starting..."); - - let dg = Deepgram::new(Setting::get("deepgram_api_key").value); - - let mut results = dg - .transcription() - .stream_request() - .stream(microphone_as_stream()) - .encoding("linear16".to_string()) - .sample_rate(44100) - .channels(1) - .start() - .await - .unwrap(); - - println!("transcription started"); - - while let Some(result) = results.next().await { - // println!("got: {:?}", result); - { - if let Ok(deepgram::transcription::live::StreamResponse::TranscriptResponse { - duration, - is_final, - channel: Channel { mut alternatives, .. }, - .. - }) = result - { - if !is_final { - *DURATION.lock().unwrap() += duration; - } - - if let Some(deepgram::transcription::live::Alternatives { words, .. }) = - alternatives.first_mut() - { - for word in words.iter() { - TRANSCRIPT.lock().unwrap().push(Some(word.clone())); - } - TRANSCRIPT.lock().unwrap().push(None); - - if is_final { - for word in words { - TRANSCRIPT_FINAL.lock().unwrap().push(Some(Word::Live(word.clone()))); - } - TRANSCRIPT_FINAL.lock().unwrap().push(None); - } - } - } - } - } - }); - } - - if ui.button("import audio file").clicked() { - tokio::spawn(async { - let file = rfd::AsyncFileDialog::new().pick_file().await.unwrap().read().await; - - let source = AudioSource::from_buffer_with_mime_type(file, "audio/aac"); - - let options = Options::builder() - .punctuate(false) - .diarize(true) - .model(deepgram::transcription::prerecorded::options::Model::CustomId( - "nova-2-meeting".to_string(), - )) - .build(); - - let dg_client = Deepgram::new(Setting::get("deepgram_api_key").value); - - eprintln!("transcribing..."); - let mut response = dg_client.transcription().prerecorded(source, &options).await.unwrap(); - eprintln!("complete."); - - TRANSCRIPT_FINAL.lock().unwrap().extend( - response.results.channels[0].alternatives[0] - .words - .drain(..) - .map(|w| Some(Word::Prerecorded(w))), - ); - }); - }; - - if ui.button("copy transcript to clipboard").clicked() { - ui.output_mut(|o| o.copied_text = self.get_transcript()); - }; - if ui.button("add window").clicked() { WHEEL_WINDOWS.lock().unwrap().push(Default::default()); }; @@ -552,7 +344,7 @@ impl eframe::App for App { }); } - ScrollArea::vertical().auto_shrink([false, false]).show(ui, |ui| { + ScrollArea::vertical().auto_shrink([false, false]).show(ui, |_ui| { // let size = [ui.available_width(), ui.spacing().interact_size.y.max(20.0)]; // for card in cards { // let i = card.rowid.unwrap(); @@ -561,31 +353,6 @@ impl eframe::App for App { // self.line_selected = i; // } // } - - let words = TRANSCRIPT.lock().unwrap(); - - let lines = words.split(|word| word.is_none()); - - for line in lines { - ui.horizontal_wrapped(|ui| { - for word in line { - if let Some(word) = word { - let color = match word.speaker { - 0 => Color32::RED, - 1 => Color32::GREEN, - 2 => Color32::BLUE, - 3 => Color32::YELLOW, - 4 => Color32::LIGHT_GRAY, - 5 => Color32::DARK_RED, - 6 => Color32::DARK_GREEN, - 7 => Color32::BLACK, - _ => Color32::WHITE, - }; - ui.label(egui::RichText::new(word.word.clone()).color(color).size(15.0)); - } - } - }); - } }); }); @@ -607,8 +374,7 @@ impl eframe::App for App { egui::Window::new(format!("wheel {}", i)).show(ctx, |ui| { ScrollArea::vertical().stick_to_bottom(true).auto_shrink([false, false]).show(ui, |ui| { if ui.button("copy all to clipboard").clicked() { - let mut text = self.get_transcript(); - text.push_str("\n"); + let mut text = "\n".to_string(); for entry in WHEEL_WINDOWS.lock().unwrap().get(i).unwrap().0.iter() { text.push_str(&format!("[{}]: {}\n", entry.role, entry.content)); @@ -714,12 +480,11 @@ impl eframe::App for App { messages.push(ChatMessage { role: User, content: String::new() }); ui.ctx().memory_mut(|m| m.request_focus(Id::new((i * 1000) + messages.len() - 1))); let id = messages.len() - 2; - let transcript = self.get_transcript(); let ctx_cloned = ctx.clone(); let (trigger, tripwire) = Tripwire::new(); self.trigger = Some(trigger); tokio::spawn(async move { - run_openai(GPT_4, tripwire, orig_messages, transcript, move |content| { + run_openai(GPT_4, tripwire, orig_messages, move |content| { WHEEL_WINDOWS .lock() .unwrap() @@ -740,43 +505,6 @@ impl eframe::App for App { }); } - egui::Window::new("Transcript").show(ctx, |ui| { - ScrollArea::vertical().stick_to_bottom(true).auto_shrink([false, false]).show(ui, |ui| { - let words = TRANSCRIPT_FINAL.lock().unwrap(); - - let lines = words.split(|word| word.is_none()); - - for line in lines { - let mut current_speaker = 100; - - ui.horizontal_wrapped(|ui| { - for word in line { - if let Some(word) = word { - if word.speaker() != current_speaker { - current_speaker = word.speaker(); - while current_speaker >= self.speaker_names.len() { - self.speaker_names.push(format!("{}", current_speaker)); - } - ui.end_row(); - ui.horizontal_wrapped(|ui| { - ui.label( - RichText::new(format!( - "[{}]: ", - self.speaker_names.get(current_speaker).unwrap_or(&String::new()) - )) - .size(30.0), - ); - }); - } - ui.label(RichText::new(word.word()).size(30.0)); - // ui.add(Label::new(RichText::new(word.word.clone()).color(color).size(30.0)).wrap(true)); - } - } - }); - } - }); - // ui.allocate_space(ui.available_size()); - }); CentralPanel::default().show(ctx, |_ui| {}); } } @@ -1043,7 +771,6 @@ pub(crate) async fn run_openai( model: &str, tripwire: Tripwire, messages: Vec, - transcript: String, callback: impl Fn(&String) + Send + 'static, ) -> Result<(), Box> { use async_openai::{types::CreateChatCompletionRequestArgs, Client}; @@ -1053,7 +780,7 @@ pub(crate) async fn run_openai( async_openai::config::OpenAIConfig::new().with_api_key(Setting::get("openai_api_key").value), ); - let mut messages = messages + let messages = messages .into_iter() .map(|m| match m.role { System => async_openai::types::ChatCompletionRequestSystemMessageArgs::default() @@ -1075,16 +802,16 @@ pub(crate) async fn run_openai( }) .collect::>(); - if !transcript.is_empty() { - messages.insert( - 0, - async_openai::types::ChatCompletionRequestUserMessageArgs::default() - .content(transcript) - .build() - .unwrap() - .into(), - ); - } + // if !transcript.is_empty() { + // messages.insert( + // 0, + // async_openai::types::ChatCompletionRequestUserMessageArgs::default() + // .content(transcript) + // .build() + // .unwrap() + // .into(), + // ); + // } // dbg!(&messages);