10 unstable releases (4 breaking)

0.5.0 Aug 12, 2019
0.4.4 Jun 11, 2019
0.4.2 Mar 15, 2019
0.4.1 Jan 6, 2019
0.1.0 Apr 21, 2018

#23 in Parser implementations

Download history 375/week @ 2019-08-06 369/week @ 2019-08-13 224/week @ 2019-08-20 340/week @ 2019-08-27 338/week @ 2019-09-03 316/week @ 2019-09-10 312/week @ 2019-09-17 343/week @ 2019-09-24 334/week @ 2019-10-01 246/week @ 2019-10-08 328/week @ 2019-10-15 431/week @ 2019-10-22 266/week @ 2019-10-29 304/week @ 2019-11-05 475/week @ 2019-11-12

1,401 downloads per month
Used in 16 crates (5 directly)


4.5K SLoC


Build Status Crates.io Documentation

svgtypes is a collection of parsers, containers and writers for SVG 1.1 types.

Usage is simple as:

use svgtypes::Path;

let path: Path = "M10-20A5.5.3-4 110-.1".parse().unwrap();
assert_eq!(path.to_string(), "M 10 -20 A 5.5 0.3 -4 1 1 0 -0.1");

You can also use a low-level, pull-based parser:

use svgtypes::PathParser;

let p = PathParser::from("M10-20A5.5.3-4 110-.1");
for token in p {
    println!("{:?}", token);

You can also tweak an output format:

use svgtypes::{Path, WriteBuffer, WriteOptions};

let path_str = "M10-20A5.5.3-4 110-.1";
let path: Path = path_str.parse().unwrap();

let opt = WriteOptions {
    remove_leading_zero: true,
    use_compact_path_notation: true,
    join_arc_to_flags: true,
    .. WriteOptions::default()

assert_eq!(path.with_write_opt(&opt).to_string(), path_str);

Supported SVG types

SVG Type Rust Type Storage Parser
<color> Color Stack
<number> f64 Stack
<length> Length Stack
<angle> Angle Stack
<viewBox> ViewBox Stack
<path> Path Heap PathParser
<list-of-numbers> NumberList Heap NumberListParser
<list-of-lengths> LengthList Heap LengthListParser
<transform-list> Transform Stack TransformListParser
<list-of-points> Points Heap PointsParser
<paint> - - Paint
  • All types implement from string (FromStr) and to string traits (Display, WriteBuffer).
  • The library doesn't store transform list as is. It will premultiplied.
  • The paint type can only be parsed.


  • Complete support of paths, so data like M10-20A5.5.3-4 110-.1 will be parsed correctly.
  • Access to pull-based parsers.
  • Pretty fast.


  • Accepts only normalized values, e.g. an input text should not contain &#x20; or &data;.
  • All keywords must be lowercase. Case-insensitive parsing is supported only for colors (requires allocation for named colors).
  • The <color> followed by the <icccolor> is not supported. As the <icccolor> itself.
  • System colors, like fill="AppWorkspace", are not supported. They were deprecated anyway.
  • Implicit path commands are not supported. All commands will be parsed as explicit.
  • Implicit MoveTo commands will be automatically converted into explicit LineTo.


  • The library should not panic. Any panic considered as a critical bug and should be reported.
  • The library forbids unsafe code.



Migration from svgparser

This crate is a successor for the svgparser crate, but it differs from it in many ways.

  • There is no XML parser or writer. You can use any you like.
  • Unlike the svgparser this crate not only parse values but can also store and write them. Currently, it has a minimal API for manipulating this values.
  • No AttributeValue. This crate provides only value parsers. You should match attributes and values by yourself.
  • No ValueId. It's up to you how to store those values.


Rust >= 1.31


Licensed under either of

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.