+fn apply_to_canvas<'a, F>(f: F, canvas_option: &'a mut Option<Canvas>, dimensions: Option<(u32, u32)>, data: &str) -> Result<&'a mut Canvas, CanvasError>
+ where F: Fn(Canvas, &mut dyn Iterator<Item = u8>) -> Result<Canvas, CanvasError>
+{
+ let canvas = match canvas_option.take() {
+ Some(canvas) => match dimensions {
+ Some(dimensions) => {
+ if dimensions == canvas.img.dimensions() {
+ Ok(canvas)
+ }
+ else {
+ _ = canvas_option.insert(canvas);
+ Err(CanvasError::DimensionMismatch)
+ }
+ },
+ None =>
+ Ok(canvas)
+ },
+ None => match dimensions {
+ Some((dim_x, dim_y)) =>
+ Ok(Canvas::new(dim_x, dim_y)),
+ None =>
+ Err(CanvasError::NotExists)
+ }
+ }?;
+
+ Ok(canvas_option.insert(f(canvas, percent_decode_str(&data).into_iter().borrow_mut())?))
+}
+