diff options
Diffstat (limited to 'third_party/rust/uniffi-example-sprites/src/lib.rs')
-rw-r--r-- | third_party/rust/uniffi-example-sprites/src/lib.rs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/third_party/rust/uniffi-example-sprites/src/lib.rs b/third_party/rust/uniffi-example-sprites/src/lib.rs new file mode 100644 index 0000000000..7aa3741d19 --- /dev/null +++ b/third_party/rust/uniffi-example-sprites/src/lib.rs @@ -0,0 +1,65 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use std::sync::RwLock; + +// A point in two-dimensional space. +#[derive(Debug, Clone)] +pub struct Point { + x: f64, + y: f64, +} + +// A magnitude and direction in two-dimensional space. +// For simplicity we represent this as a point relative to the origin. +#[derive(Debug, Clone)] +pub struct Vector { + dx: f64, + dy: f64, +} + +// Move from the given Point, according to the given Vector. +pub fn translate(p: &Point, v: Vector) -> Point { + Point { + x: p.x + v.dx, + y: p.y + v.dy, + } +} + +// An entity in our imaginary world, which occupies a position in space +// and which can move about over time. +#[derive(Debug)] +pub struct Sprite { + // We must use interior mutability for managing mutable state, hence the `RwLock`. + current_position: RwLock<Point>, +} + +impl Sprite { + fn new(initial_position: Option<Point>) -> Sprite { + Sprite { + current_position: RwLock::new(initial_position.unwrap_or(Point { x: 0.0, y: 0.0 })), + } + } + + fn new_relative_to(reference: Point, direction: Vector) -> Sprite { + Sprite { + current_position: RwLock::new(translate(&reference, direction)), + } + } + + fn get_position(&self) -> Point { + self.current_position.read().unwrap().clone() + } + + fn move_to(&self, position: Point) { + *self.current_position.write().unwrap() = position; + } + + fn move_by(&self, direction: Vector) { + let mut current_position = self.current_position.write().unwrap(); + *current_position = translate(¤t_position, direction) + } +} + +include!(concat!(env!("OUT_DIR"), "/sprites.uniffi.rs")); |