aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-01-13 20:21:45 +0100
committermetamuffin <metamuffin@disroot.org>2023-01-13 20:21:45 +0100
commit36e91c20eb59e76d5aeb35e644e7fb391f346dc6 (patch)
tree45ea6dd876ec3af8e38857bce6d26faf630011de
parent8fc4b9792044d82e729e8b4ef993c6391d711c5b (diff)
downloadjellything-36e91c20eb59e76d5aeb35e644e7fb391f346dc6.tar
jellything-36e91c20eb59e76d5aeb35e644e7fb391f346dc6.tar.bz2
jellything-36e91c20eb59e76d5aeb35e644e7fb391f346dc6.tar.zst
proc macro works
-rw-r--r--ebml/src/lib.rs31
-rw-r--r--ebml/src/matroska.rs262
-rw-r--r--ebml/src/read.rs6
-rw-r--r--ebml_derive/src/lib.rs177
4 files changed, 295 insertions, 181 deletions
diff --git a/ebml/src/lib.rs b/ebml/src/lib.rs
index 116b8e2..acebae3 100644
--- a/ebml/src/lib.rs
+++ b/ebml/src/lib.rs
@@ -47,3 +47,34 @@ impl EbmlReader {
})
}
}
+
+pub trait ValueFromBuf: Sized {
+ fn from_buf(buf: &[u8]) -> anyhow::Result<Self>;
+}
+
+impl ValueFromBuf for u64 {
+ fn from_buf(buf: &[u8]) -> anyhow::Result<Self> {
+ if buf.len() != 8 {
+ bail!("u64 is not 64 bits long")
+ }
+ Ok((buf[0] as u64) << 24
+ | (buf[1] as u64) << 16
+ | (buf[2] as u64) << 8
+ | (buf[3] as u64) << 0)
+ }
+}
+impl ValueFromBuf for Vec<u8> {
+ fn from_buf(buf: &[u8]) -> anyhow::Result<Self> {
+ Ok(buf.to_vec())
+ }
+}
+impl ValueFromBuf for String {
+ fn from_buf(buf: &[u8]) -> anyhow::Result<Self> {
+ Ok(String::from_utf8(Vec::from(buf))?)
+ }
+}
+impl ValueFromBuf for Master {
+ fn from_buf(_buf: &[u8]) -> anyhow::Result<Self> {
+ Ok(Master::Start)
+ }
+}
diff --git a/ebml/src/matroska.rs b/ebml/src/matroska.rs
index 802ce6a..966530c 100644
--- a/ebml/src/matroska.rs
+++ b/ebml/src/matroska.rs
@@ -5,16 +5,16 @@ define_ebml! {
global Void[0xec]: Binary,
Ebml[0x1a45dfa3]: {
- EbmlVersion[0x4286]: u64,
- EbmlReadVersion[0x42f7]: u64,
- EbmlMaxIdLength[0x42f2]: u64,
- EbmlMaxSizeLength[0x42f3]: u64,
+ EbmlVersion[0x4286]: Uint,
+ EbmlReadVersion[0x42f7]: Uint,
+ EbmlMaxIdLength[0x42f2]: Uint,
+ EbmlMaxSizeLength[0x42f3]: Uint,
DocType[0x4282]: Utf8,
- DocTypeVersion[0x4287]: u64,
- DocTypeReadVersion[0x4285]: u64,
+ DocTypeVersion[0x4287]: Uint,
+ DocTypeReadVersion[0x4285]: Uint,
DocTypeExtension[0x4281]: {
DocTypeExtensionName[0x4283]: Utf8,
- DocTypeExtensionVersion[0x4284]: u64,
+ DocTypeExtensionVersion[0x4284]: Uint,
},
},
}
@@ -27,92 +27,92 @@ define_ebml! {
// #[id=0x4660] Segment/Attachments/AttachedFile/FileMimeType(Utf8),
// #[id=0x466E] Segment/Attachments/AttachedFile/FileName(Utf8),
// #[id=0x4675] Segment/Attachments/AttachedFile/FileReferral(Vec<u8>),
-// #[id=0x46AE] Segment/Attachments/AttachedFile/FileUID(u64),
-// #[id=0x4662] Segment/Attachments/AttachedFile/FileUsedEndTime(u64),
-// #[id=0x4661] Segment/Attachments/AttachedFile/FileUsedStartTime(u64),
+// #[id=0x46AE] Segment/Attachments/AttachedFile/FileUID(Uint),
+// #[id=0x4662] Segment/Attachments/AttachedFile/FileUsedEndTime(Uint),
+// #[id=0x4661] Segment/Attachments/AttachedFile/FileUsedStartTime(Uint),
// #[id=0x1043A770] Segment/Chapters(Master),
// #[id=0x45B9] Segment/Chapters/EditionEntry(Master),
// #[id=0xB6] Segment/Chapters/EditionEntry/ChapterAtom(Master),
// #[id=0x6944] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess(Master),
-// #[id=0x6955] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessCodecID(u64),
+// #[id=0x6955] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessCodecID(Uint),
// #[id=0x6911] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessCommand(Master),
// #[id=0x6933] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessCommand/ChapProcessData(Vec<u8>),
-// #[id=0x6922] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessCommand/ChapProcessTime(u64),
+// #[id=0x6922] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessCommand/ChapProcessTime(Uint),
// #[id=0x450D] Segment/Chapters/EditionEntry/ChapterAtom/ChapProcess/ChapProcessPrivate(Vec<u8>),
// #[id=0x80] Segment/Chapters/EditionEntry/ChapterAtom/ChapterDisplay(Master),
// #[id=0x437E] Segment/Chapters/EditionEntry/ChapterAtom/ChapterDisplay/ChapCountry(Utf8),
// #[id=0x437C] Segment/Chapters/EditionEntry/ChapterAtom/ChapterDisplay/ChapLanguage(Utf8),
// #[id=0x437D] Segment/Chapters/EditionEntry/ChapterAtom/ChapterDisplay/ChapLanguageIETF(Utf8),
// #[id=0x85] Segment/Chapters/EditionEntry/ChapterAtom/ChapterDisplay/ChapString(Utf8),
-// #[id=0x4598] Segment/Chapters/EditionEntry/ChapterAtom/ChapterFlagEnabled(u64),
-// #[id=0x98] Segment/Chapters/EditionEntry/ChapterAtom/ChapterFlagHidden(u64),
-// #[id=0x63C3] Segment/Chapters/EditionEntry/ChapterAtom/ChapterPhysicalEquiv(u64),
-// #[id=0x6EBC] Segment/Chapters/EditionEntry/ChapterAtom/ChapterSegmentEditionUID(u64),
+// #[id=0x4598] Segment/Chapters/EditionEntry/ChapterAtom/ChapterFlagEnabled(Uint),
+// #[id=0x98] Segment/Chapters/EditionEntry/ChapterAtom/ChapterFlagHidden(Uint),
+// #[id=0x63C3] Segment/Chapters/EditionEntry/ChapterAtom/ChapterPhysicalEquiv(Uint),
+// #[id=0x6EBC] Segment/Chapters/EditionEntry/ChapterAtom/ChapterSegmentEditionUID(Uint),
// #[id=0x6E67] Segment/Chapters/EditionEntry/ChapterAtom/ChapterSegmentUID(Vec<u8>),
// #[id=0x5654] Segment/Chapters/EditionEntry/ChapterAtom/ChapterStringUID(Utf8),
-// #[id=0x92] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTimeEnd(u64),
-// #[id=0x91] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTimeStart(u64),
+// #[id=0x92] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTimeEnd(Uint),
+// #[id=0x91] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTimeStart(Uint),
// #[id=0x8F] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTrack(Master),
-// #[id=0x89] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTrack/ChapterTrackUID(u64),
-// #[id=0x73C4] Segment/Chapters/EditionEntry/ChapterAtom/ChapterUID(u64),
-// #[id=0x45DB] Segment/Chapters/EditionEntry/EditionFlagDefault(u64),
-// #[id=0x45BD] Segment/Chapters/EditionEntry/EditionFlagHidden(u64),
-// #[id=0x45DD] Segment/Chapters/EditionEntry/EditionFlagOrdered(u64),
-// #[id=0x45BC] Segment/Chapters/EditionEntry/EditionUID(u64),
+// #[id=0x89] Segment/Chapters/EditionEntry/ChapterAtom/ChapterTrack/ChapterTrackUID(Uint),
+// #[id=0x73C4] Segment/Chapters/EditionEntry/ChapterAtom/ChapterUID(Uint),
+// #[id=0x45DB] Segment/Chapters/EditionEntry/EditionFlagDefault(Uint),
+// #[id=0x45BD] Segment/Chapters/EditionEntry/EditionFlagHidden(Uint),
+// #[id=0x45DD] Segment/Chapters/EditionEntry/EditionFlagOrdered(Uint),
+// #[id=0x45BC] Segment/Chapters/EditionEntry/EditionUID(Uint),
// #[id=0x1F43B675] Segment/Cluster(Master),
// #[id=0xA0] Segment/Cluster/BlockGroup(Master),
// #[id=0xA1] Segment/Cluster/BlockGroup/Block(Vec<u8>),
// #[id=0x75A1] Segment/Cluster/BlockGroup/BlockAdditions(Master),
// #[id=0xA6] Segment/Cluster/BlockGroup/BlockAdditions/BlockMore(Master),
-// #[id=0xEE] Segment/Cluster/BlockGroup/BlockAdditions/BlockMore/BlockAddID(u64),
+// #[id=0xEE] Segment/Cluster/BlockGroup/BlockAdditions/BlockMore/BlockAddID(Uint),
// #[id=0xA5] Segment/Cluster/BlockGroup/BlockAdditions/BlockMore/BlockAdditional(Vec<u8>),
-// #[id=0x9B] Segment/Cluster/BlockGroup/BlockDuration(u64),
+// #[id=0x9B] Segment/Cluster/BlockGroup/BlockDuration(Uint),
// #[id=0xA2] Segment/Cluster/BlockGroup/BlockVirtual(Vec<u8>),
// #[id=0xA4] Segment/Cluster/BlockGroup/CodecState(Vec<u8>),
// #[id=0x75A2] Segment/Cluster/BlockGroup/DiscardPadding(Integer),
// #[id=0xFB] Segment/Cluster/BlockGroup/ReferenceBlock(Integer),
// #[id=0xC8] Segment/Cluster/BlockGroup/ReferenceFrame(Master),
-// #[id=0xC9] Segment/Cluster/BlockGroup/ReferenceFrame/ReferenceOffset(u64),
-// #[id=0xCA] Segment/Cluster/BlockGroup/ReferenceFrame/ReferenceTimestamp(u64),
-// #[id=0xFA] Segment/Cluster/BlockGroup/ReferencePriority(u64),
+// #[id=0xC9] Segment/Cluster/BlockGroup/ReferenceFrame/ReferenceOffset(Uint),
+// #[id=0xCA] Segment/Cluster/BlockGroup/ReferenceFrame/ReferenceTimestamp(Uint),
+// #[id=0xFA] Segment/Cluster/BlockGroup/ReferencePriority(Uint),
// #[id=0xFD] Segment/Cluster/BlockGroup/ReferenceVirtual(Integer),
// #[id=0x8E] Segment/Cluster/BlockGroup/Slices(Master),
// #[id=0xE8] Segment/Cluster/BlockGroup/Slices/TimeSlice(Master),
-// #[id=0xCB] Segment/Cluster/BlockGroup/Slices/TimeSlice/BlockAdditionID(u64),
-// #[id=0xCE] Segment/Cluster/BlockGroup/Slices/TimeSlice/Delay(u64),
-// #[id=0xCD] Segment/Cluster/BlockGroup/Slices/TimeSlice/FrameNumber(u64),
-// #[id=0xCC] Segment/Cluster/BlockGroup/Slices/TimeSlice/LaceNumber(u64),
-// #[id=0xCF] Segment/Cluster/BlockGroup/Slices/TimeSlice/SliceDuration(u64),
+// #[id=0xCB] Segment/Cluster/BlockGroup/Slices/TimeSlice/BlockAdditionID(Uint),
+// #[id=0xCE] Segment/Cluster/BlockGroup/Slices/TimeSlice/Delay(Uint),
+// #[id=0xCD] Segment/Cluster/BlockGroup/Slices/TimeSlice/FrameNumber(Uint),
+// #[id=0xCC] Segment/Cluster/BlockGroup/Slices/TimeSlice/LaceNumber(Uint),
+// #[id=0xCF] Segment/Cluster/BlockGroup/Slices/TimeSlice/SliceDuration(Uint),
// #[id=0xAF] Segment/Cluster/EncryptedBlock(Vec<u8>),
-// #[id=0xA7] Segment/Cluster/Position(u64),
-// #[id=0xAB] Segment/Cluster/PrevSize(u64),
+// #[id=0xA7] Segment/Cluster/Position(Uint),
+// #[id=0xAB] Segment/Cluster/PrevSize(Uint),
// #[id=0x5854] Segment/Cluster/SilentTracks(Master),
-// #[id=0x58D7] Segment/Cluster/SilentTracks/SilentTrackNumber(u64),
+// #[id=0x58D7] Segment/Cluster/SilentTracks/SilentTrackNumber(Uint),
// #[id=0xA3] Segment/Cluster/SimpleBlock(Vec<u8>),
-// #[id=0xE7] Segment/Cluster/Timestamp(u64),
+// #[id=0xE7] Segment/Cluster/Timestamp(Uint),
// #[id=0x1C53BB6B] Segment/Cues(Master),
// #[id=0xBB] Segment/Cues/CuePoint(Master),
-// #[id=0xB3] Segment/Cues/CuePoint/CueTime(u64),
+// #[id=0xB3] Segment/Cues/CuePoint/CueTime(Uint),
// #[id=0xB7] Segment/Cues/CuePoint/CueTrackPositions(Master),
-// #[id=0x5378] Segment/Cues/CuePoint/CueTrackPositions/CueBlockNumber(u64),
-// #[id=0xF1] Segment/Cues/CuePoint/CueTrackPositions/CueClusterPosition(u64),
-// #[id=0xEA] Segment/Cues/CuePoint/CueTrackPositions/CueCodecState(u64),
-// #[id=0xB2] Segment/Cues/CuePoint/CueTrackPositions/CueDuration(u64),
+// #[id=0x5378] Segment/Cues/CuePoint/CueTrackPositions/CueBlockNumber(Uint),
+// #[id=0xF1] Segment/Cues/CuePoint/CueTrackPositions/CueClusterPosition(Uint),
+// #[id=0xEA] Segment/Cues/CuePoint/CueTrackPositions/CueCodecState(Uint),
+// #[id=0xB2] Segment/Cues/CuePoint/CueTrackPositions/CueDuration(Uint),
// #[id=0xDB] Segment/Cues/CuePoint/CueTrackPositions/CueReference(Master),
-// #[id=0x97] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefCluster(u64),
-// #[id=0xEB] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefCodecState(u64),
-// #[id=0x535F] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefNumber(u64),
-// #[id=0x96] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefTime(u64),
-// #[id=0xF0] Segment/Cues/CuePoint/CueTrackPositions/CueRelativePosition(u64),
-// #[id=0xF7] Segment/Cues/CuePoint/CueTrackPositions/CueTrack(u64),
+// #[id=0x97] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefCluster(Uint),
+// #[id=0xEB] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefCodecState(Uint),
+// #[id=0x535F] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefNumber(Uint),
+// #[id=0x96] Segment/Cues/CuePoint/CueTrackPositions/CueReference/CueRefTime(Uint),
+// #[id=0xF0] Segment/Cues/CuePoint/CueTrackPositions/CueRelativePosition(Uint),
+// #[id=0xF7] Segment/Cues/CuePoint/CueTrackPositions/CueTrack(Uint),
// #[id=0x1549A966] Segment/Info(Master),
// #[id=0x6924] Segment/Info/ChapterTranslate(Master),
-// #[id=0x69BF] Segment/Info/ChapterTranslate/ChapterTranslateCodec(u64),
-// #[id=0x69FC] Segment/Info/ChapterTranslate/ChapterTranslateEditionUID(u64),
+// #[id=0x69BF] Segment/Info/ChapterTranslate/ChapterTranslateCodec(Uint),
+// #[id=0x69FC] Segment/Info/ChapterTranslate/ChapterTranslateEditionUID(Uint),
// #[id=0x69A5] Segment/Info/ChapterTranslate/ChapterTranslateID(Vec<u8>),
// #[id=0x4461] Segment/Info/DateUTC(Integer),
// #[id=0x4489] Segment/Info/Duration(Float),
@@ -124,49 +124,49 @@ define_ebml! {
// #[id=0x4444] Segment/Info/SegmentFamily(Vec<u8>),
// #[id=0x7384] Segment/Info/SegmentFilename(Utf8),
// #[id=0x73A4] Segment/Info/SegmentUID(Vec<u8>),
-// #[id=0x2AD7B1] Segment/Info/TimestampScale(u64),
+// #[id=0x2AD7B1] Segment/Info/TimestampScale(Uint),
// #[id=0x7BA9] Segment/Info/Title(Utf8),
// #[id=0x5741] Segment/Info/WritingApp(Utf8),
// #[id=0x114D9B74] Segment/SeekHead(Master),
// #[id=0x4DBB] Segment/SeekHead/Seek(Master),
// #[id=0x53AB] Segment/SeekHead/Seek/SeekID(Vec<u8>),
-// #[id=0x53AC] Segment/SeekHead/Seek/SeekPosition(u64),
+// #[id=0x53AC] Segment/SeekHead/Seek/SeekPosition(Uint),
// #[id=0x1254C367] Segment/Tags(Master),
// #[id=0x7373] Segment/Tags/Tag(Master),
// #[id=0x67C8] Segment/Tags/Tag/SimpleTag(Master),
// #[id=0x4485] Segment/Tags/Tag/SimpleTag/TagBinary(Vec<u8>),
-// #[id=0x4484] Segment/Tags/Tag/SimpleTag/TagDefault(u64),
-// #[id=0x44B4] Segment/Tags/Tag/SimpleTag/TagDefaultBogus(u64),
+// #[id=0x4484] Segment/Tags/Tag/SimpleTag/TagDefault(Uint),
+// #[id=0x44B4] Segment/Tags/Tag/SimpleTag/TagDefaultBogus(Uint),
// #[id=0x447A] Segment/Tags/Tag/SimpleTag/TagLanguage(Utf8),
// #[id=0x447B] Segment/Tags/Tag/SimpleTag/TagLanguageIETF(Utf8),
// #[id=0x45A3] Segment/Tags/Tag/SimpleTag/TagName(Utf8),
// #[id=0x4487] Segment/Tags/Tag/SimpleTag/TagString(Utf8),
// #[id=0x63C0] Segment/Tags/Tag/Targets(Master),
-// #[id=0x63C6] Segment/Tags/Tag/Targets/TagAttachmentUID(u64),
-// #[id=0x63C4] Segment/Tags/Tag/Targets/TagChapterUID(u64),
-// #[id=0x63C9] Segment/Tags/Tag/Targets/TagEditionUID(u64),
-// #[id=0x63C5] Segment/Tags/Tag/Targets/TagTrackUID(u64),
+// #[id=0x63C6] Segment/Tags/Tag/Targets/TagAttachmentUID(Uint),
+// #[id=0x63C4] Segment/Tags/Tag/Targets/TagChapterUID(Uint),
+// #[id=0x63C9] Segment/Tags/Tag/Targets/TagEditionUID(Uint),
+// #[id=0x63C5] Segment/Tags/Tag/Targets/TagTrackUID(Uint),
// #[id=0x63CA] Segment/Tags/Tag/Targets/TargetType(Utf8),
-// #[id=0x68CA] Segment/Tags/Tag/Targets/TargetTypeValue(u64),
+// #[id=0x68CA] Segment/Tags/Tag/Targets/TargetTypeValue(Uint),
// #[id=0x1654AE6B] Segment/Tracks(Master),
// #[id=0xAE] Segment/Tracks/TrackEntry(Master),
-// #[id=0x7446] Segment/Tracks/TrackEntry/AttachmentLink(u64),
+// #[id=0x7446] Segment/Tracks/TrackEntry/AttachmentLink(Uint),
// #[id=0xE1] Segment/Tracks/TrackEntry/Audio(Master),
-// #[id=0x6264] Segment/Tracks/TrackEntry/Audio/BitDepth(u64),
+// #[id=0x6264] Segment/Tracks/TrackEntry/Audio/BitDepth(Uint),
// #[id=0x7D7B] Segment/Tracks/TrackEntry/Audio/ChannelPositions(Vec<u8>),
-// #[id=0x9F] Segment/Tracks/TrackEntry/Audio/Channels(u64),
+// #[id=0x9F] Segment/Tracks/TrackEntry/Audio/Channels(Uint),
// #[id=0x78B5] Segment/Tracks/TrackEntry/Audio/OutputSamplingFrequency(Float),
// #[id=0xB5] Segment/Tracks/TrackEntry/Audio/SamplingFrequency(Float),
// #[id=0x41E4] Segment/Tracks/TrackEntry/BlockAdditionMapping(Master),
// #[id=0x41ED] Segment/Tracks/TrackEntry/BlockAdditionMapping/BlockAddIDExtraData(Vec<u8>),
// #[id=0x41A4] Segment/Tracks/TrackEntry/BlockAdditionMapping/BlockAddIDName(Utf8),
-// #[id=0x41E7] Segment/Tracks/TrackEntry/BlockAdditionMapping/BlockAddIDType(u64),
-// #[id=0x41F0] Segment/Tracks/TrackEntry/BlockAdditionMapping/BlockAddIDValue(u64),
-// #[id=0xAA] Segment/Tracks/TrackEntry/CodecDecodeAll(u64),
-// #[id=0x56AA] Segment/Tracks/TrackEntry/CodecDelay(u64),
+// #[id=0x41E7] Segment/Tracks/TrackEntry/BlockAdditionMapping/BlockAddIDType(Uint),
+// #[id=0x41F0] Segment/Tracks/TrackEntry/BlockAdditionMapping/BlockAddIDValue(Uint),
+// #[id=0xAA] Segment/Tracks/TrackEntry/CodecDecodeAll(Uint),
+// #[id=0x56AA] Segment/Tracks/TrackEntry/CodecDelay(Uint),
// #[id=0x26B240] Segment/Tracks/TrackEntry/CodecDownloadURL(Utf8),
// #[id=0x86] Segment/Tracks/TrackEntry/CodecID(Utf8),
// #[id=0x3B4040] Segment/Tracks/TrackEntry/CodecInfoURL(Utf8),
@@ -176,71 +176,71 @@ define_ebml! {
// #[id=0x6D80] Segment/Tracks/TrackEntry/ContentEncodings(Master),
// #[id=0x6240] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding(Master),
// #[id=0x5034] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentCompression(Master),
-// #[id=0x4254] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentCompression/ContentCompAlgo(u64),
+// #[id=0x4254] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentCompression/ContentCompAlgo(Uint),
// #[id=0x4255] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentCompression/ContentCompSettings(Vec<u8>),
-// #[id=0x5031] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncodingOrder(u64),
-// #[id=0x5032] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncodingScope(u64),
-// #[id=0x5033] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncodingType(u64),
+// #[id=0x5031] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncodingOrder(Uint),
+// #[id=0x5032] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncodingScope(Uint),
+// #[id=0x5033] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncodingType(Uint),
// #[id=0x5035] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption(Master),
// #[id=0x47E7] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentEncAESSettings(Master),
-// #[id=0x47E8] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentEncAESSettings/AESSettingsCipherMode(u64),
-// #[id=0x47E1] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentEncAlgo(u64),
+// #[id=0x47E8] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentEncAESSettings/AESSettingsCipherMode(Uint),
+// #[id=0x47E1] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentEncAlgo(Uint),
// #[id=0x47E2] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentEncKeyID(Vec<u8>),
-// #[id=0x47E5] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentSigAlgo(u64),
-// #[id=0x47E6] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentSigHashAlgo(u64),
+// #[id=0x47E5] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentSigAlgo(Uint),
+// #[id=0x47E6] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentSigHashAlgo(Uint),
// #[id=0x47E4] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentSigKeyID(Vec<u8>),
// #[id=0x47E3] Segment/Tracks/TrackEntry/ContentEncodings/ContentEncoding/ContentEncryption/ContentSignature(Vec<u8>),
-// #[id=0x234E7A] Segment/Tracks/TrackEntry/DefaultDecodedFieldDuration(u64),
-// #[id=0x23E383] Segment/Tracks/TrackEntry/DefaultDuration(u64),
-// #[id=0x55AF] Segment/Tracks/TrackEntry/FlagCommentary(u64),
-// #[id=0x88] Segment/Tracks/TrackEntry/FlagDefault(u64),
-// #[id=0xB9] Segment/Tracks/TrackEntry/FlagEnabled(u64),
-// #[id=0x55AA] Segment/Tracks/TrackEntry/FlagForced(u64),
-// #[id=0x55AB] Segment/Tracks/TrackEntry/FlagHearingImpaired(u64),
-// #[id=0x9C] Segment/Tracks/TrackEntry/FlagLacing(u64),
-// #[id=0x55AE] Segment/Tracks/TrackEntry/FlagOriginal(u64),
-// #[id=0x55AD] Segment/Tracks/TrackEntry/FlagTextDescriptions(u64),
-// #[id=0x55AC] Segment/Tracks/TrackEntry/FlagVisualImpaired(u64),
+// #[id=0x234E7A] Segment/Tracks/TrackEntry/DefaultDecodedFieldDuration(Uint),
+// #[id=0x23E383] Segment/Tracks/TrackEntry/DefaultDuration(Uint),
+// #[id=0x55AF] Segment/Tracks/TrackEntry/FlagCommentary(Uint),
+// #[id=0x88] Segment/Tracks/TrackEntry/FlagDefault(Uint),
+// #[id=0xB9] Segment/Tracks/TrackEntry/FlagEnabled(Uint),
+// #[id=0x55AA] Segment/Tracks/TrackEntry/FlagForced(Uint),
+// #[id=0x55AB] Segment/Tracks/TrackEntry/FlagHearingImpaired(Uint),
+// #[id=0x9C] Segment/Tracks/TrackEntry/FlagLacing(Uint),
+// #[id=0x55AE] Segment/Tracks/TrackEntry/FlagOriginal(Uint),
+// #[id=0x55AD] Segment/Tracks/TrackEntry/FlagTextDescriptions(Uint),
+// #[id=0x55AC] Segment/Tracks/TrackEntry/FlagVisualImpaired(Uint),
// #[id=0x22B59C] Segment/Tracks/TrackEntry/Language(Utf8),
// #[id=0x22B59D] Segment/Tracks/TrackEntry/LanguageIETF(Utf8),
-// #[id=0x55EE] Segment/Tracks/TrackEntry/MaxBlockAdditionID(u64),
-// #[id=0x6DF8] Segment/Tracks/TrackEntry/MaxCache(u64),
-// #[id=0x6DE7] Segment/Tracks/TrackEntry/MinCache(u64),
+// #[id=0x55EE] Segment/Tracks/TrackEntry/MaxBlockAdditionID(Uint),
+// #[id=0x6DF8] Segment/Tracks/TrackEntry/MaxCache(Uint),
+// #[id=0x6DE7] Segment/Tracks/TrackEntry/MinCache(Uint),
// #[id=0x536E] Segment/Tracks/TrackEntry/Name(Utf8),
-// #[id=0x56BB] Segment/Tracks/TrackEntry/SeekPreRoll(u64),
-// #[id=0xD7] Segment/Tracks/TrackEntry/TrackNumber(u64),
+// #[id=0x56BB] Segment/Tracks/TrackEntry/SeekPreRoll(Uint),
+// #[id=0xD7] Segment/Tracks/TrackEntry/TrackNumber(Uint),
// #[id=0x537F] Segment/Tracks/TrackEntry/TrackOffset(Integer),
// #[id=0xE2] Segment/Tracks/TrackEntry/TrackOperation(Master),
// #[id=0xE3] Segment/Tracks/TrackEntry/TrackOperation/TrackCombinePlanes(Master),
// #[id=0xE4] Segment/Tracks/TrackEntry/TrackOperation/TrackCombinePlanes/TrackPlane(Master),
-// #[id=0xE6] Segment/Tracks/TrackEntry/TrackOperation/TrackCombinePlanes/TrackPlane/TrackPlaneType(u64),
-// #[id=0xE5] Segment/Tracks/TrackEntry/TrackOperation/TrackCombinePlanes/TrackPlane/TrackPlaneUID(u64),
+// #[id=0xE6] Segment/Tracks/TrackEntry/TrackOperation/TrackCombinePlanes/TrackPlane/TrackPlaneType(Uint),
+// #[id=0xE5] Segment/Tracks/TrackEntry/TrackOperation/TrackCombinePlanes/TrackPlane/TrackPlaneUID(Uint),
// #[id=0xE9] Segment/Tracks/TrackEntry/TrackOperation/TrackJoinBlocks(Master),
-// #[id=0xED] Segment/Tracks/TrackEntry/TrackOperation/TrackJoinBlocks/TrackJoinUID(u64),
-// #[id=0x6FAB] Segment/Tracks/TrackEntry/TrackOverlay(u64),
+// #[id=0xED] Segment/Tracks/TrackEntry/TrackOperation/TrackJoinBlocks/TrackJoinUID(Uint),
+// #[id=0x6FAB] Segment/Tracks/TrackEntry/TrackOverlay(Uint),
// #[id=0x23314F] Segment/Tracks/TrackEntry/TrackTimestampScale(Float),
// #[id=0x6624] Segment/Tracks/TrackEntry/TrackTranslate(Master),
-// #[id=0x66BF] Segment/Tracks/TrackEntry/TrackTranslate/TrackTranslateCodec(u64),
-// #[id=0x66FC] Segment/Tracks/TrackEntry/TrackTranslate/TrackTranslateEditionUID(u64),
+// #[id=0x66BF] Segment/Tracks/TrackEntry/TrackTranslate/TrackTranslateCodec(Uint),
+// #[id=0x66FC] Segment/Tracks/TrackEntry/TrackTranslate/TrackTranslateEditionUID(Uint),
// #[id=0x66A5] Segment/Tracks/TrackEntry/TrackTranslate/TrackTranslateTrackID(Vec<u8>),
-// #[id=0x83] Segment/Tracks/TrackEntry/TrackType(u64),
-// #[id=0x73C5] Segment/Tracks/TrackEntry/TrackUID(u64),
+// #[id=0x83] Segment/Tracks/TrackEntry/TrackType(Uint),
+// #[id=0x73C5] Segment/Tracks/TrackEntry/TrackUID(Uint),
// #[id=0xC4] Segment/Tracks/TrackEntry/TrickMasterTrackSegmentUID(Vec<u8>),
-// #[id=0xC7] Segment/Tracks/TrackEntry/TrickMasterTrackUID(u64),
-// #[id=0xC6] Segment/Tracks/TrackEntry/TrickTrackFlag(u64),
+// #[id=0xC7] Segment/Tracks/TrackEntry/TrickMasterTrackUID(Uint),
+// #[id=0xC6] Segment/Tracks/TrackEntry/TrickTrackFlag(Uint),
// #[id=0xC1] Segment/Tracks/TrackEntry/TrickTrackSegmentUID(Vec<u8>),
-// #[id=0xC0] Segment/Tracks/TrackEntry/TrickTrackUID(u64),
+// #[id=0xC0] Segment/Tracks/TrackEntry/TrickTrackUID(Uint),
// #[id=0xE0] Segment/Tracks/TrackEntry/Video(Master),
-// #[id=0x53C0] Segment/Tracks/TrackEntry/Video/AlphaMode(u64),
-// #[id=0x54B3] Segment/Tracks/TrackEntry/Video/AspectRatioType(u64),
+// #[id=0x53C0] Segment/Tracks/TrackEntry/Video/AlphaMode(Uint),
+// #[id=0x54B3] Segment/Tracks/TrackEntry/Video/AspectRatioType(Uint),
// #[id=0x55B0] Segment/Tracks/TrackEntry/Video/Colour(Master),
-// #[id=0x55B2] Segment/Tracks/TrackEntry/Video/Colour/BitsPerChannel(u64),
-// #[id=0x55B5] Segment/Tracks/TrackEntry/Video/Colour/CbSubsamplingHorz(u64),
-// #[id=0x55B6] Segment/Tracks/TrackEntry/Video/Colour/CbSubsamplingVert(u64),
-// #[id=0x55B7] Segment/Tracks/TrackEntry/Video/Colour/ChromaSitingHorz(u64),
-// #[id=0x55B8] Segment/Tracks/TrackEntry/Video/Colour/ChromaSitingVert(u64),
-// #[id=0x55B3] Segment/Tracks/TrackEntry/Video/Colour/ChromaSubsamplingHorz(u64),
-// #[id=0x55B4] Segment/Tracks/TrackEntry/Video/Colour/ChromaSubsamplingVert(u64),
+// #[id=0x55B2] Segment/Tracks/TrackEntry/Video/Colour/BitsPerChannel(Uint),
+// #[id=0x55B5] Segment/Tracks/TrackEntry/Video/Colour/CbSubsamplingHorz(Uint),
+// #[id=0x55B6] Segment/Tracks/TrackEntry/Video/Colour/CbSubsamplingVert(Uint),
+// #[id=0x55B7] Segment/Tracks/TrackEntry/Video/Colour/ChromaSitingHorz(Uint),
+// #[id=0x55B8] Segment/Tracks/TrackEntry/Video/Colour/ChromaSitingVert(Uint),
+// #[id=0x55B3] Segment/Tracks/TrackEntry/Video/Colour/ChromaSubsamplingHorz(Uint),
+// #[id=0x55B4] Segment/Tracks/TrackEntry/Video/Colour/ChromaSubsamplingVert(Uint),
// #[id=0x55D0] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata(Master),
// #[id=0x55D9] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/LuminanceMax(Float),
// #[id=0x55DA] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/LuminanceMin(Float),
@@ -252,31 +252,31 @@ define_ebml! {
// #[id=0x55D2] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/PrimaryRChromaticityY(Float),
// #[id=0x55D7] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/WhitePointChromaticityX(Float),
// #[id=0x55D8] Segment/Tracks/TrackEntry/Video/Colour/MasteringMetadata/WhitePointChromaticityY(Float),
-// #[id=0x55B1] Segment/Tracks/TrackEntry/Video/Colour/MatrixCoefficients(u64),
-// #[id=0x55BC] Segment/Tracks/TrackEntry/Video/Colour/MaxCLL(u64),
-// #[id=0x55BD] Segment/Tracks/TrackEntry/Video/Colour/MaxFALL(u64),
-// #[id=0x55BB] Segment/Tracks/TrackEntry/Video/Colour/Primaries(u64),
-// #[id=0x55B9] Segment/Tracks/TrackEntry/Video/Colour/Range(u64),
-// #[id=0x55BA] Segment/Tracks/TrackEntry/Video/Colour/TransferCharacteristics(u64),
-// #[id=0x54BA] Segment/Tracks/TrackEntry/Video/DisplayHeight(u64),
-// #[id=0x54B2] Segment/Tracks/TrackEntry/Video/DisplayUnit(u64),
-// #[id=0x54B0] Segment/Tracks/TrackEntry/Video/DisplayWidth(u64),
-// #[id=0x9D] Segment/Tracks/TrackEntry/Video/FieldOrder(u64),
-// #[id=0x9A] Segment/Tracks/TrackEntry/Video/FlagInterlaced(u64),
+// #[id=0x55B1] Segment/Tracks/TrackEntry/Video/Colour/MatrixCoefficients(Uint),
+// #[id=0x55BC] Segment/Tracks/TrackEntry/Video/Colour/MaxCLL(Uint),
+// #[id=0x55BD] Segment/Tracks/TrackEntry/Video/Colour/MaxFALL(Uint),
+// #[id=0x55BB] Segment/Tracks/TrackEntry/Video/Colour/Primaries(Uint),
+// #[id=0x55B9] Segment/Tracks/TrackEntry/Video/Colour/Range(Uint),
+// #[id=0x55BA] Segment/Tracks/TrackEntry/Video/Colour/TransferCharacteristics(Uint),
+// #[id=0x54BA] Segment/Tracks/TrackEntry/Video/DisplayHeight(Uint),
+// #[id=0x54B2] Segment/Tracks/TrackEntry/Video/DisplayUnit(Uint),
+// #[id=0x54B0] Segment/Tracks/TrackEntry/Video/DisplayWidth(Uint),
+// #[id=0x9D] Segment/Tracks/TrackEntry/Video/FieldOrder(Uint),
+// #[id=0x9A] Segment/Tracks/TrackEntry/Video/FlagInterlaced(Uint),
// #[id=0x2383E3] Segment/Tracks/TrackEntry/Video/FrameRate(Float),
// #[id=0x2FB523] Segment/Tracks/TrackEntry/Video/GammaValue(Float),
-// #[id=0x53B9] Segment/Tracks/TrackEntry/Video/OldStereoMode(u64),
-// #[id=0x54AA] Segment/Tracks/TrackEntry/Video/PixelCropBottom(u64),
-// #[id=0x54CC] Segment/Tracks/TrackEntry/Video/PixelCropLeft(u64),
-// #[id=0x54DD] Segment/Tracks/TrackEntry/Video/PixelCropRight(u64),
-// #[id=0x54BB] Segment/Tracks/TrackEntry/Video/PixelCropTop(u64),
-// #[id=0xBA] Segment/Tracks/TrackEntry/Video/PixelHeight(u64),
-// #[id=0xB0] Segment/Tracks/TrackEntry/Video/PixelWidth(u64),
+// #[id=0x53B9] Segment/Tracks/TrackEntry/Video/OldStereoMode(Uint),
+// #[id=0x54AA] Segment/Tracks/TrackEntry/Video/PixelCropBottom(Uint),
+// #[id=0x54CC] Segment/Tracks/TrackEntry/Video/PixelCropLeft(Uint),
+// #[id=0x54DD] Segment/Tracks/TrackEntry/Video/PixelCropRight(Uint),
+// #[id=0x54BB] Segment/Tracks/TrackEntry/Video/PixelCropTop(Uint),
+// #[id=0xBA] Segment/Tracks/TrackEntry/Video/PixelHeight(Uint),
+// #[id=0xB0] Segment/Tracks/TrackEntry/Video/PixelWidth(Uint),
// #[id=0x7670] Segment/Tracks/TrackEntry/Video/Projection(Master),
// #[id=0x7674] Segment/Tracks/TrackEntry/Video/Projection/ProjectionPosePitch(Float),
// #[id=0x7675] Segment/Tracks/TrackEntry/Video/Projection/ProjectionPoseRoll(Float),
// #[id=0x7673] Segment/Tracks/TrackEntry/Video/Projection/ProjectionPoseYaw(Float),
// #[id=0x7672] Segment/Tracks/TrackEntry/Video/Projection/ProjectionPrivate(Vec<u8>),
-// #[id=0x7671] Segment/Tracks/TrackEntry/Video/Projection/ProjectionType(u64),
-// #[id=0x53B8] Segment/Tracks/TrackEntry/Video/StereoMode(u64),
+// #[id=0x7671] Segment/Tracks/TrackEntry/Video/Projection/ProjectionType(Uint),
+// #[id=0x53B8] Segment/Tracks/TrackEntry/Video/StereoMode(Uint),
// #[id=0x2EB524] Segment/Tracks/TrackEntry/Video/UncompressedFourCC(Vec<u8>)
diff --git a/ebml/src/read.rs b/ebml/src/read.rs
index 9864ea5..7431683 100644
--- a/ebml/src/read.rs
+++ b/ebml/src/read.rs
@@ -1,9 +1,5 @@
use std::io::{Read, Seek};
-
-use anyhow::{bail, Result};
-use log::debug;
-
-// use crate::matroska::{Master, MatroskaTag};
+use anyhow::Result;
trait ReadAndSeek: Read + Seek {}
impl<T: Read + Seek> ReadAndSeek for T {}
diff --git a/ebml_derive/src/lib.rs b/ebml_derive/src/lib.rs
index 2c9dd9c..07e60f9 100644
--- a/ebml_derive/src/lib.rs
+++ b/ebml_derive/src/lib.rs
@@ -1,63 +1,150 @@
-use proc_macro::{Delimiter, TokenStream, TokenTree};
+use proc_macro::{token_stream, Delimiter, Span, TokenStream, TokenTree};
use quote::quote;
+use syn::{Fields, FieldsUnnamed, Ident, Variant};
struct Tag {
id: u64,
- path: Vec<String>,
- name: String,
+ global: bool,
+ path: Vec<u64>,
+ name: Ident,
r#type: Option<String>, // None -> Master
}
#[proc_macro]
pub fn define_ebml(ts: TokenStream) -> TokenStream {
- let mut next_glob = false;
let mut ts = ts.into_iter();
-
let mut tags = vec![];
+ parse_kt(&mut tags, &mut ts, vec![]);
- while let Some(t) = ts.next() {
- match t {
- TokenTree::Ident(ident) => {
- let ident = ident.to_string();
- if &ident == "global" {
- next_glob = true;
- } else {
- let glob = next_glob;
- next_glob = false;
- let id = if let Some(TokenTree::Group(gr)) = ts.next() {
- assert_eq!(gr.delimiter(), Delimiter::Bracket);
- let mut ts = gr.stream().into_iter();
- if let TokenTree::Literal(lit) = ts.next().unwrap() {
- u64::from_str_radix(&lit.to_string()[2..], 16).unwrap()
- } else {
- panic!("literal expected")
- }
- } else {
- panic!("group expected")
- };
- if let Some(TokenTree::Punct(p)) = ts.next() {
- assert_eq!(p.as_char(), ':')
- } else {
- panic!("colon expected")
- }
- match ts.next() {
- Some(TokenTree::Group(_)) => {}
- Some(TokenTree::Ident(ident)) => {
- let r#type = ident.to_string();
- eprintln!("global={glob} id={id}, type={}", r#type);
+ let enum_variants = tags
+ .iter()
+ .map(|e| Variant {
+ ident: e.name.clone(),
+ attrs: vec![],
+ fields: Fields::Unnamed(
+ syn::parse2::<FieldsUnnamed>(match e.r#type.clone() {
+ None => quote!((Master)),
+ Some(r#type) => match r#type.as_str() {
+ "Uint" => quote!((u64)),
+ "Utf8" => quote!((String)),
+ "Binary" => quote!((Vec<u8>)),
+ _ => panic!("unsupported type {}", r#type),
+ },
+ })
+ .expect("parse type"),
+ ),
+ discriminant: None,
+ })
+ .collect::<Vec<_>>();
+
+ let path_match = tags
+ .iter()
+ .map(|e| {
+ let name = &e.name;
+ let mut path = e.path.clone();
+ path.reverse();
+ if e.global {
+ quote! { Self::#name(_) => None }
+ } else {
+ quote! { Self::#name(_) => Some(&[#(#path),*]) }
+ }
+ })
+ .collect::<Vec<_>>();
+
+ let parse_match = tags
+ .iter()
+ .map(|Tag { id, name, .. }| {
+ quote! { #id => Self::#name(crate::ValueFromBuf::from_buf(data)?) }
+ })
+ .collect::<Vec<_>>();
+
+ quote! {
+ use crate::Master;
+ pub enum MatroskaTag {
+ #(#enum_variants),*
+ }
+ impl MatroskaTag {
+ /// returns path in **reverse** order or None if global.
+ pub fn path(&self) -> Option<&'static [u64]> {
+ match self { #(#path_match),* }
+ }
+ pub fn parse(id: u64, data: &[u8]) -> anyhow::Result<Self> {
+ Ok(match id { #(#parse_match),*, _ => anyhow::bail!("unknown id") })
+ }
+ }
+ }
+ .into()
+}
+
+fn parse_kt(tags: &mut Vec<Tag>, ts: &mut token_stream::IntoIter, path: Vec<u64>) {
+ let mut next_glob = false;
+ loop {
+ let global = next_glob;
+ next_glob = false;
- }
- _ => panic!("group or ident expected"),
- }
- if let Some(TokenTree::Punct(p)) = ts.next() {
- assert_eq!(p.as_char(), ',')
- } else {
- panic!("colon expected")
- }
+ let name = if let Some(tt) = ts.next() {
+ if let TokenTree::Ident(name) = tt {
+ if &name.to_string() == "global" {
+ next_glob = true;
+ continue;
}
+ name.to_string()
+ } else {
+ panic!("expected ident")
}
- x => panic!("unexpected {x:?}"),
+ } else {
+ break;
+ };
+
+ let id = if let Some(TokenTree::Group(gr)) = ts.next() {
+ assert_eq!(gr.delimiter(), Delimiter::Bracket);
+ let mut ts = gr.stream().into_iter();
+ if let TokenTree::Literal(lit) = ts.next().unwrap() {
+ u64::from_str_radix(&lit.to_string()[2..], 16).unwrap()
+ } else {
+ panic!("literal expected")
+ }
+ } else {
+ panic!("group expected")
+ };
+ if let Some(TokenTree::Punct(p)) = ts.next() {
+ assert_eq!(p.as_char(), ':')
+ } else {
+ panic!("colon expected")
+ }
+ match ts.next() {
+ Some(TokenTree::Group(gr)) => {
+ // eprintln!("entering group");
+ let mut ts = gr.stream().into_iter();
+ tags.push(Tag {
+ global,
+ id,
+ name: Ident::new(&name, Span::call_site().into()),
+ path: path.clone(),
+ r#type: None,
+ });
+ let mut path = path.clone();
+ path.push(id);
+ parse_kt(tags, &mut ts, path);
+ // eprintln!("leaving group");
+ }
+ Some(TokenTree::Ident(r#type)) => {
+ let r#type = r#type.to_string();
+ // eprintln!("global={global} id={id}, type={}", r#type);
+ tags.push(Tag {
+ id,
+ name: Ident::new(&name, Span::call_site().into()),
+ path: path.clone(),
+ global,
+ r#type: Some(r#type),
+ })
+ }
+ _ => panic!("group or ident expected"),
+ }
+ if let Some(TokenTree::Punct(p)) = ts.next() {
+ assert_eq!(p.as_char(), ',')
+ } else {
+ panic!("colon expected")
}
}
- quote! {}.into()
}