pub fn from_windows_str(s: &str) -> Result<Self, SignalParseError> {
		match s.to_ascii_uppercase().as_str() {
			"CTRL-CLOSE" | "CTRL+CLOSE" | "CLOSE" => Ok(Self::Hangup),
			"CTRL-BREAK" | "CTRL+BREAK" | "BREAK" => Ok(Self::Terminate),
			"CTRL-C" | "CTRL+C" | "C" => Ok(Self::Interrupt),
			"KILL" | "SIGKILL" | "FORCE-STOP" | "STOP" => Ok(Self::ForceStop),
			_ => Err(SignalParseError::new(s, "unknown control name")),
		}
	}
Parse the input as a windows control event.

This parses the input as a control event name, in a case-insensitive manner.

The names matched are mostly made up as there's no standard for them, but should be familiar
to Windows users. They are mapped to the corresponding unix concepts as follows:

- `CTRL-CLOSE`, `CTRL+CLOSE`, or `CLOSE` for a hangup
- `CTRL-BREAK`, `CTRL+BREAK`, or `BREAK` for a terminate
- `CTRL-C`, `CTRL+C`, or `C` for an interrupt
- `STOP`, `FORCE-STOP` for a forced stop. This is also mapped to `KILL` and `SIGKILL`.

```
# use watchexec_signals::Signal;
assert_eq!(Signal::Hangup, Signal::from_windows_str("ctrl+close").unwrap());
assert_eq!(Signal::Interrupt, Signal::from_windows_str("C").unwrap());
assert_eq!(Signal::ForceStop, Signal::from_windows_str("Stop").unwrap());
```

Using [`FromStr`] is recommended for practical use, as it will fall back to parsing as a
unix signal, which can be helpful for portability.
crates/signals/src/lib.rs