fn update()

in candle-wasm-examples/yolo/src/app.rs [145:230]


    fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
        match msg {
            Msg::SetModel(md) => {
                self.status = "weights loaded successfully!".to_string();
                self.loaded = true;
                console_log!("loaded weights");
                self.worker.send(WorkerInput::ModelData(md));
                true
            }
            Msg::Run => {
                if self.current_decode.is_some() {
                    self.status = "already processing some image at the moment".to_string()
                } else {
                    let start_time = performance_now();
                    self.current_decode = Some(CurrentDecode { start_time });
                    self.status = "processing...".to_string();
                    self.generated.clear();
                    ctx.link().send_future(async {
                        match fetch_url("bike.jpeg").await {
                            Err(err) => {
                                let status = format!("{err:?}");
                                Msg::UpdateStatus(status)
                            }
                            Ok(image_data) => Msg::WorkerIn(WorkerInput::RunData(RunData {
                                image_data,
                                conf_threshold: 0.5,
                                iou_threshold: 0.5,
                            })),
                        }
                    });
                }
                true
            }
            Msg::WorkerOut(output) => {
                match output {
                    Ok(WorkerOutput::WeightsLoaded) => self.status = "weights loaded!".to_string(),
                    Ok(WorkerOutput::ProcessingDone(Err(err))) => {
                        self.status = format!("error in worker process: {err}");
                        self.current_decode = None
                    }
                    Ok(WorkerOutput::ProcessingDone(Ok(bboxes))) => {
                        let mut content = Vec::new();
                        for (class_index, bboxes_for_class) in bboxes.iter().enumerate() {
                            for b in bboxes_for_class.iter() {
                                content.push(format!(
                                    "bbox {}: xs {:.0}-{:.0}  ys {:.0}-{:.0}",
                                    crate::coco_classes::NAMES[class_index],
                                    b.xmin,
                                    b.xmax,
                                    b.ymin,
                                    b.ymax
                                ))
                            }
                        }
                        self.generated = content.join("\n");
                        let dt = self.current_decode.as_ref().and_then(|current_decode| {
                            current_decode.start_time.and_then(|start_time| {
                                performance_now().map(|stop_time| stop_time - start_time)
                            })
                        });
                        self.status = match dt {
                            None => "processing succeeded!".to_string(),
                            Some(dt) => format!("processing succeeded in {dt:.2}s",),
                        };
                        self.current_decode = None;
                        if let Err(err) = draw_bboxes(bboxes) {
                            self.status = format!("{err:?}")
                        }
                    }
                    Err(err) => {
                        self.status = format!("error in worker {err:?}");
                    }
                }
                true
            }
            Msg::WorkerIn(inp) => {
                self.worker.send(inp);
                true
            }
            Msg::UpdateStatus(status) => {
                self.status = status;
                true
            }
            Msg::Refresh => true,
        }
    }