Size: a a a

Rust — русскоговорящее сообществo

2020 October 21

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Разве что возвращать Some(Err(_)), а потом менять состояние на «всегда возвращать None»
источник

Э

Эрик in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Разве что возвращать Some(Err(_)), а потом менять состояние на «всегда возвращать None»
Ну вроде того. Может callback запросить, чтобы выполнять на терминальной ошибке.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Эрик
Ну вроде того. Может callback запросить, чтобы выполнять на терминальной ошибке.
Что-то из стдлибы добавляет структуре итератора метод для получения финальных данных, но это ломает основной юзкейс, ИМХО
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Ы, да ну нафиг этот неудобный интерфейс, сделаю просто функцию .iterate(|item| /* process item */)
источник

Э

Эрик in Rust — русскоговорящее сообществo
Это называется for_each, лол.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну и да, иногда for_each без next намного проще.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Эрик
Это называется for_each, лол.
Не совсем, у меня структура объединяет и чтение, и запись
источник

В

Виталий in Rust — русскоговорящее сообществo
здравствуйте, пишу враппер для mplayer. почему не работает write/read? не могу не читать stdout, не писать в stdin
use tokio::io::{AsyncBufReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() {
   let filename = "/home/user/Intro.mp3";
   let volume: i32 = 30;

   let mut mplayer = match tokio::process::Command::new("mplayer")
       .arg("-slave")
       .arg("-idle")
       .arg("-noautosub")
       .arg("-noconsolecontrols")
       .arg("-nolirc")
       .arg("-really-quiet")
       .args(&["-softvol", "-volume", &volume.to_string()])
       .args(&["-vc", "null"])
       .args(&["-vo", "null"])
       .args(&["-ao", "alsa:device=plughw=1.0"])
       .arg("")
       .stdout(std::process::Stdio::piped())
       .stdin(std::process::Stdio::piped())
       .spawn()
   {
       Ok(p) => p,
       Err(e) => {
           println!("Can't mplayer: {}", e);
           return;
       }
   };

   let child_in = mplayer.stdin.as_mut().unwrap();
   let mut child_out = tokio::io::BufReader::new(mplayer.stdout.as_mut().unwrap());

   let mut interval_second = tokio::time::interval(std::time::Duration::from_secs(1));

   let cmd = format!("loadfile {}\n", filename);
   if let Err(e) = child_in.write_all(cmd.as_bytes()).await {
       println!("mplayer error: {}", e);
   }
   
   if let Err(e) = child_in.flush().await {
       println!("FLUSH: {}", e);
   }

   let mut line = String::new();

   loop {
       tokio::select! {
           _ = child_out.read_line(&mut line) => {
               println!("line:{}", line);
               if line.is_empty() {
                       println!("MPlayer: break");
                       break;
                   }
                   }
                   _ = interval_second.tick() => {
                       println!("tick");
                   }
       }
   }
   println!("finish");
}
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
Если я не ошибаюсь , чтобы буфридер/райтер работали , соответствующие дескрипторы должны менеджиться токио
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
То есть например вместо стд спавна нужен какой нибудь Токио спавн
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
А нет , у вас уже это есть простите
источник

ph

pl 🦑 hk in Rust — русскоговорящее сообществo
∅ ч
нужно ограничить число одновременно запущенных
источник

Э

Эрик in Rust — русскоговорящее сообществo
Виталий
здравствуйте, пишу враппер для mplayer. почему не работает write/read? не могу не читать stdout, не писать в stdin
use tokio::io::{AsyncBufReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() {
   let filename = "/home/user/Intro.mp3";
   let volume: i32 = 30;

   let mut mplayer = match tokio::process::Command::new("mplayer")
       .arg("-slave")
       .arg("-idle")
       .arg("-noautosub")
       .arg("-noconsolecontrols")
       .arg("-nolirc")
       .arg("-really-quiet")
       .args(&["-softvol", "-volume", &volume.to_string()])
       .args(&["-vc", "null"])
       .args(&["-vo", "null"])
       .args(&["-ao", "alsa:device=plughw=1.0"])
       .arg("")
       .stdout(std::process::Stdio::piped())
       .stdin(std::process::Stdio::piped())
       .spawn()
   {
       Ok(p) => p,
       Err(e) => {
           println!("Can't mplayer: {}", e);
           return;
       }
   };

   let child_in = mplayer.stdin.as_mut().unwrap();
   let mut child_out = tokio::io::BufReader::new(mplayer.stdout.as_mut().unwrap());

   let mut interval_second = tokio::time::interval(std::time::Duration::from_secs(1));

   let cmd = format!("loadfile {}\n", filename);
   if let Err(e) = child_in.write_all(cmd.as_bytes()).await {
       println!("mplayer error: {}", e);
   }
   
   if let Err(e) = child_in.flush().await {
       println!("FLUSH: {}", e);
   }

   let mut line = String::new();

   loop {
       tokio::select! {
           _ = child_out.read_line(&mut line) => {
               println!("line:{}", line);
               if line.is_empty() {
                       println!("MPlayer: break");
                       break;
                   }
                   }
                   _ = interval_second.tick() => {
                       println!("tick");
                   }
       }
   }
   println!("finish");
}
Что по ошибке?
источник

В

Виталий in Rust — русскоговорящее сообществo
Эрик
Что по ошибке?
Никакой ошибки. Просто тишина
источник

Э

Эрик in Rust — русскоговорящее сообществo
Пробовал без селекта с тиками выводить?
источник

Э

Эрик in Rust — русскоговорящее сообществo
И да, у тебя line никогда пустой не будет, потому что ты её не очищаешь.
источник

В

Виталий in Rust — русскоговорящее сообществo
Эрик
Пробовал без селекта с тиками выводить?
Это как?
источник

В

Виталий in Rust — русскоговорящее сообществo
Эрик
И да, у тебя line никогда пустой не будет, потому что ты её не очищаешь.
Я ставил принт. Тот блок даже не отрабатывается
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну просто временно убрать селект и выводить по готовности сообщений, а не по таймингу.
источник

В

Виталий in Rust — русскоговорящее сообществo
Селект я поставил чтобы видеть что работа идёт
источник