#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace scwx { namespace awips { struct Vtec { PVtec pVtec_; std::string hVtec_; Vtec() : pVtec_ {}, hVtec_ {} {} Vtec(const Vtec&) = delete; Vtec& operator=(const Vtec&) = delete; Vtec(Vtec&&) noexcept = default; Vtec& operator=(Vtec&&) noexcept = default; }; struct SegmentHeader { std::vector ugcString_; Ugc ugc_; std::vector vtecString_; std::vector ugcNames_; std::string issuanceDateTime_; SegmentHeader() : ugcString_ {}, ugc_ {}, vtecString_ {}, ugcNames_ {}, issuanceDateTime_ {} { } SegmentHeader(const SegmentHeader&) = delete; SegmentHeader& operator=(const SegmentHeader&) = delete; SegmentHeader(SegmentHeader&&) noexcept = default; SegmentHeader& operator=(SegmentHeader&&) noexcept = default; }; struct Segment { std::shared_ptr wmoHeader_ {}; std::optional header_ {}; std::vector productContent_ {}; std::optional codedLocation_ {}; std::optional codedMotion_ {}; bool observed_ {false}; ibw::ThreatCategory threatCategory_ {ibw::ThreatCategory::Base}; bool tornadoPossible_ {false}; Segment() = default; Segment(const Segment&) = delete; Segment& operator=(const Segment&) = delete; Segment(Segment&&) noexcept = default; Segment& operator=(Segment&&) noexcept = default; std::chrono::system_clock::time_point event_begin() const; std::chrono::system_clock::time_point event_end() const; }; class TextProductMessageImpl; class TextProductMessage : public Message { public: explicit TextProductMessage(); ~TextProductMessage(); TextProductMessage(const TextProductMessage&) = delete; TextProductMessage& operator=(const TextProductMessage&) = delete; TextProductMessage(TextProductMessage&&) noexcept; TextProductMessage& operator=(TextProductMessage&&) noexcept; [[nodiscard]] boost::uuids::uuid uuid() const; std::string message_content() const; std::shared_ptr wmo_header() const; std::vector mnd_header() const; std::vector overview_block() const; std::size_t segment_count() const; std::vector> segments() const; std::shared_ptr segment(std::size_t s) const; std::chrono::system_clock::time_point segment_event_begin(std::size_t s) const; std::size_t data_size() const override; bool Parse(std::istream& is) override; static std::shared_ptr Create(std::istream& is); private: std::unique_ptr p; }; } // namespace awips } // namespace scwx