Skip to main content

sva_core/
analyze.rs

1// Concern: answers the readings asked of a buffer nothing rendered, or refuses one needing a graph | Non-concern: decoding, routing (sva-cli) | IO: (target, Buffer, Asked) -> Answers or CliError
2
3use sva_engine::{Buffer, PSYCHOACOUSTIC_V1, READINGS, answer_buffer};
4
5use crate::{Answer, Asked, CliError};
6
7/// Refuses a reading a buffer cannot answer alone.
8pub fn analyzable(asked: &[Asked]) -> Result<(), CliError> {
9    let Some(one) = asked.iter().find(|one| !one.off_samples(true)) else {
10        return Ok(());
11    };
12    let answered: Vec<&str> = READINGS
13        .iter()
14        .filter(|row| row.reads.off_samples(true))
15        .map(|row| row.name)
16        .collect();
17    Err(CliError::usage(
18        "query.not_analyzable",
19        format!(
20            "`analyze` does not answer `{}` — only {} need no rendered graph",
21            one.name,
22            answered.join(", ")
23        ),
24    ))
25}
26
27/// Every reading asked of `buffer`, in order.
28pub fn analyzed(target: &str, buffer: &Buffer, asked: &[Asked]) -> Result<Vec<Answer>, CliError> {
29    analyzable(asked)?;
30    asked
31        .iter()
32        .map(|one| {
33            answer_buffer(
34                target,
35                buffer,
36                one.representation(buffer.rate, None)?,
37                PSYCHOACOUSTIC_V1.name,
38            )
39            .map_err(CliError::Engine)
40        })
41        .collect()
42}