defmodule Image.Plug.Pipeline.Ops.Rotate do @moduledoc """ Rotation operation. Rotates the working image by `angle` degrees clockwise. Arbitrary angles in `0..360` are accepted by the IR and the interpreter — internally this calls `Image.rotate/2` which uses libvips' affine transform for non-90° angles. Provider URL parsers may impose narrower constraints reflecting their CDN's grammar: * **Cloudflare** and **ImageKit** restrict to multiples of 90° (the only values their URL grammars accept). * **imgix** accepts arbitrary integer degrees. * **IIIF Image API 3.0** accepts arbitrary `0..360` (integer or fractional), so a `Rotate{angle: 45.5}` round-trips cleanly through the IIIF provider. An angle of `0` (or `+0.0`) is a no-op and is dropped by `Image.Plug.Pipeline.Normaliser`. """ @type t :: %__MODULE__{angle: number()} defstruct angle: 0 end