1pub trait Quil: std::fmt::Debug {
7 fn to_quil(&self) -> Result<String, ToQuilError> {
9 let mut buffer = String::new();
10 self.write(&mut buffer, false)?;
11 Ok(buffer)
12 }
13
14 fn to_quil_or_debug(&self) -> String {
18 let mut buffer = String::new();
19 let _ = self.write(&mut buffer, true);
20 buffer
21 }
22
23 fn write(
26 &self,
27 writer: &mut impl std::fmt::Write,
28 fall_back_to_debug: bool,
29 ) -> Result<(), ToQuilError>;
30}
31
32pub(crate) const INDENT: &str = " ";
35
36pub type ToQuilResult<T> = Result<T, ToQuilError>;
37
38#[derive(Debug, thiserror::Error, PartialEq)]
40#[non_exhaustive]
41pub enum ToQuilError {
42 #[error("Failed to write Quil: {0}")]
43 FormatError(#[from] std::fmt::Error),
44 #[error("Label has not yet been resolved")]
45 UnresolvedLabelPlaceholder,
46 #[error("Qubit has not yet been resolved")]
47 UnresolvedQubitPlaceholder,
48}
49
50pub(crate) fn write_join_quil<'i, I, T>(
52 writer: &mut impl std::fmt::Write,
53 fall_back_to_debug: bool,
54 values: I,
55 joiner: &str,
56 prefix: &str,
57) -> Result<(), ToQuilError>
58where
59 I: IntoIterator<Item = &'i T>,
60 T: Quil + 'i,
61{
62 let mut iter = values.into_iter();
63 if let Some(first) = iter.next() {
64 write!(writer, "{prefix}")?;
65 first.write(writer, fall_back_to_debug)?;
66
67 for value in iter {
68 write!(writer, "{joiner}{prefix}")?;
69 value.write(writer, fall_back_to_debug)?;
70 }
71 }
72 Ok(())
73}