27 #include <zypp-core/base/DefaultIntegral> 28 #include <zypp-core/base/DtorReset> 31 #include <zypp-core/ui/ProgressData> 38 #include <zypp-tui/output/PromptOptions> 55 template <
class Tltext,
class Trtext>
56 inline std::string
join(
const Tltext & ltext,
const Trtext & rtext,
const char * sep =
" " )
60 inline bool endsOnWS(
const std::string & str_r )
64 {
int l = *str_r.rbegin();
if ( ::strchr(
" \n\t", l ) ) ret =
true; }
69 {
return(
endsOnWS( str_r ) ?
"" :
" " ); }
87 template <
class TFormater>
struct Writer;
89 ListLayout(
bool singleline_r,
bool wrapline_r,
bool gaped_r,
unsigned indent_r )
103 template <
bool singleline_,
bool wrapline_,
bool gaped_,
unsigned indent_>
120 template <
class TFormater>
struct Writer;
136 inline std::string
asListElement(
const std::string & val_r ) {
return val_r; }
140 template <
class Tp =
void>
149 TableRow asTableRow(
const Tp & val_r );
184 {
return asTableHeader<>(); }
196 template <
class TFormater>
203 {
return _formater.xmlListElement( val_r ); }
223 template <
class TFormater>
224 struct ListLayout::Writer
242 const std::string & element(
_formater.listElement( std::forward<Tp>(val_r) ) );
272 {
_cpos += element_r.size();
_str << element_r; }
290 template <
class TFormater>
323 template <
class TContainer,
class TFormater,
class TLayout =
typename TFormater::NormalLayout>
324 void writeContainer( std::ostream & str_r,
const TContainer & container_r,
const TFormater & formater_r,
const TLayout & layout_r = TLayout() )
326 typedef typename TLayout::template Writer<TFormater> Writer;
327 Writer writer( str_r, layout_r, formater_r );
328 for (
auto && el : container_r )
333 template <
class TContainer,
class TFormater>
334 void xmlWriteContainer( std::ostream & str_r,
const TContainer & container_r,
const TFormater & formater_r )
366 std::string
get()
const 367 {
return std::string(
lhs) + std::string(
rhs); }
372 std::string
get(
unsigned width_r, SplitFlags flags_r,
char exp_r )
const;
374 std::string
get(
unsigned width_r, SplitFlags flags_r )
const 375 {
return get( width_r, flags_r,
expHint ); }
377 std::string
get(
unsigned width_r,
char exp_r )
const 378 {
return get( width_r,
flagsHint, exp_r ); }
380 std::string
get(
unsigned width_r )
const 484 XmlNode(
Out & out_r,
const std::string & name_r,
const std::initializer_list<Attr> & attrs_r = {} )
493 :
XmlNode( out_r, name_r, { std::move(attr_r) } )
500 zypp::scoped_ptr<zypp::xmlout::Node>
_node;
509 void xmlNode(
const std::string & name_r,
const std::initializer_list<XmlNode::Attr> & attrs_r = {} )
513 {
xmlNode( name_r, { std::move(attr_r) } ); }
522 {
if (
out().
typeNORMAL() && ! title_r.empty() ) std::cout << title_r << std::endl; }
528 template <
class TContainer,
class TFormater>
529 void container(
const std::string & nodeName_r,
const std::string & title_r,
530 const TContainer & container_r,
const TFormater & formater_r )
548 template <
class TContainer,
class TFormater = out::ListFormater>
549 void list(
const std::string & nodeName_r,
const std::string & title_r,
550 const TContainer & container_r,
const TFormater & formater_r = TFormater() )
551 {
container( nodeName_r, title_r, container_r, formater_r ); }
555 template <
class TContainer,
class TFormater = out::TableFormater>
556 void table(
const std::string & nodeName_r,
const std::string & title_r,
557 const TContainer & container_r,
const TFormater & formater_r = TFormater() )
558 {
container( nodeName_r, title_r, container_r, formater_r ); }
573 template <
class Text>
582 template <
class Text>
584 {
par( 0, text_r, format_r ); }
588 template <
class TText,
class Text>
592 template <
class TText,
class Text>
594 {
taggedPar( 0, tag_r, text_r, format_r ); }
598 template <
class Text>
602 template <
class Text>
604 {
notePar( 0, text_r, format_r ); }
607 template <
class Text>
611 template <
class Text>
616 template <
class Text>
620 template <
class Text>
622 {
errorPar( 0, text_r, format_r ); }
645 {
info( msg_r.
get(), verbosity_r, mask_r ); }
653 ,
_str( new
std::ostringstream )
658 ,
_str( std::move(rhs._str) )
666 {
return (*
_str) << val; }
668 operator std::ostream &()
675 std::unique_ptr<std::ostringstream>
_str;
686 outstr.
rhs <<
' ' << rmsg;
695 outstr.
rhs <<
" (" << hint <<
')';
726 virtual void error(
const std::string & problem_desc,
const std::string & hint =
"") = 0;
737 const std::string & problem_desc,
738 const std::string & hint =
"") = 0;
759 const std::string & label,
760 bool is_tick =
false) = 0;
771 virtual void progress(
const std::string &
id,
772 const std::string & label,
786 const std::string & label,
787 const std::string & donetag,
788 bool error =
false) = 0;
852 const std::string &
prompt,
854 const std::string & startdesc =
"") = 0;
881 #define SCOPED_VERBOSITY( OUT, LEVEL ) const auto & raii __attribute__ ((__unused__))( (OUT).scopedVerbosity( LEVEL )) 912 ret = desired_r ? desired_r : 150U;
913 else if ( desired_r < ret )
995 ProgressBar(
Out & out_r,
NoStartBar, std::string progressId_r,
const std::string & label_r,
unsigned current_r = 0,
unsigned total_r = 0 )
1001 else if ( current_r )
1015 ProgressBar(
Out & out_r,
const std::string & progressId_r,
const std::string & label_r,
unsigned current_r = 0,
unsigned total_r = 0 )
1022 ProgressBar(
Out & out_r,
const std::string & label_r,
unsigned current_r = 0,
unsigned total_r = 0 )
1023 :
ProgressBar( out_r,
"", label_r, current_r, total_r )
1043 void print(
const std::string & label_r )
1059 void error(
const std::string & label_r )
1098 std::string
outLabel(
const std::string & msg_r )
const 1102 {
int ret = 1;
while ( num_r /= 10 ) ++ret;
return ret; }
1151 Error(
int exitcode_r, std::string msg_r, std::string hint_r = std::string() )
zypp::ProgressData * operator->()
virtual void setUseColors(bool yesno)
Hint for a handler whether config would allow to use colors.
Convenience class for progress output.
std::ostream & node(std::ostream &out_r, const std::string &name_r, Node::Attr attr_r)
ProgressBar(Out &out_r, const std::string &progressId_r, const std::string &label_r, unsigned current_r=0, unsigned total_r=0)
Ctor displays initial progress bar.
virtual std::string zyppExceptionReport(const zypp::Exception &e)
Return a Exception as a string suitable for output.
void errorPar(const Text &text_r, ParFormat format_r=ParFormat())
void infoLRHint(const std::string &lmsg, const std::string &hint, Verbosity verbosity=NORMAL, Type mask=TYPE_ALL)
Info message with R-adjusted "(hint)".
zypp::ProgressData & operator*()
XmlNode(XmlNode &&rhs) noexcept
Move ctor.
void mbs_write_wrapped(std::ostream &out, boost::string_ref text_r, size_t indent_r, size_t wrap_r, int indentFix_r=0)
Wrap and indent given text and write it to the output stream out.
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
void taggedPar(size_t indent_r, const TText &tag_r, const Text &text_r, ParFormat format_r=ParFormat())
Paragraph of text preceded by 'tag_r' and a ' '.
void notePar(size_t indent_r, const Text &text_r, ParFormat format_r=ParFormat())
Paragraph tagged with 'Note: '.
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
Base class for producing common (for now) zypper output.
bool type(TypeBit type_r) const
Test for a specific type.
RAII writing a nodes start/end tag.
zypp::DtorReset scopedVerbosity(Verbosity verbosity_r)
Return RAII class for exception safe scoped verbosity change.
unsigned _indent
amount of indent
virtual void warning(const std::string &msg, Verbosity verbosity=NORMAL, Type mask=TYPE_ALL)=0
Show a warning.
Writer(std::ostream &str_r, const ListLayout &layout_r, const TFormater &formater_r)
XmlNode with optional normal text headline (NL appended)
bool _gaped
add extra NL before element (if singleline)
virtual void dwnldProgress(const zypp::Url &uri, int value=-1, long rate=-1)=0
Reports download progress.
void error(ProgressEnd donetag_r=ProgressEnd::error)
Explicitly indicate the error condition for the final progress bar.
Print(ProgressBar &bar_r)
static constexpr unsigned termwidthUnlimited
const zypp::ProgressData & operator*() const
Error(int exitcode_r, std::string msg_r, std::string hint_r=std::string())
virtual void progressEnd(const std::string &id, const std::string &label, const std::string &donetag, bool error=false)=0
End of an operation with reported progress.
void xmlWriteContainer(std::ostream &str_r, const TContainer &container_r, const TFormater &formater_r)
Write XML formatted container to stream.
bool fitsOnLine(unsigned size_r) const
const std::string & asString(const std::string &t)
Global asString() that works with std::string too.
Example: PromptOptions popts; popts.setOptions(_("y/n/p"), 0 / * default reply * /); popts...
TableHeader asTableHeader< void >()
XmlNode(Out &out_r, const std::string &name_r, const std::initializer_list< Attr > &attrs_r={})
Ctor taking nodename and attribute list.
bool _singleline
one list element per line
Verbosity verbosity() const
Get current verbosity.
const TFormater & _formater
std::unique_ptr< std::ostringstream > _str
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
More detailed description of the operations.
Error(int exitcode_r, const zypp::Exception &ex_r, std::string hint_r=std::string())
Error(int exitcode_r, std::string msg_r, const zypp::Exception &ex_r, std::string hint_r=std::string())
(Key, Value) string pair of XML node attributes
std::ostream & printRichText(std::ostream &str, std::string text, unsigned indent_r=0U, unsigned width_r=0U)
Print [Rich]Text optionally indented.
const std::ostream & stream() const
ColorString tagError()
translated "Error:" error color
void par(size_t indent_r, const Text &text_r, ParFormat format_r=ParFormat())
Paragraph of text, optionally indented, or without leading gap.
Convenience class Error reporting.
Assign a vaiable a certain value when going out of scope.
zypp::scoped_ptr< zypp::xmlout::Node > _node
std::optional< ProgressEnd > _donetag
void setVerbosity(Verbosity verbosity)
Set current verbosity.
bool operator()(const zypp::ProgressData &progress_r)
virtual void infoLine(const TermLine &msg_r, Verbosity verbosity_r=NORMAL, Type mask_r=TYPE_ALL)
info taking a TermLine
bool endsOnWS(const std::string &str_r)
Whether the str_r ends with a WS.
const TFormater & _formater
zypp::ProgressData _progress
void error(const char *label_r)
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
detail::ListLayoutInit< true, true, false, 0U > DefaultListLayout
one element per line, no indent
TermLine(SplitFlags flags_r)
TableLayout DefaultTableLayout
Simple Table.
static constexpr Type TYPE_ALL
void writeContainer(std::ostream &str_r, const TContainer &container_r, const TFormater &formater_r, const TLayout &layout_r=TLayout())
Write formatted container to stream.
Table & setHeader(TableHeader tr)
Default output verbosity level.
void xmlNode(const std::string &name_r, const std::initializer_list< XmlNode::Attr > &attrs_r={})
XML only: Write a leaf node without PCDATA.
ZYPP_DECLARE_FLAGS(Type, TypeBit)
detail::ListLayoutInit< true, false, false, 0U > XmlListLayout
ProgressBar(Out &out_r, const std::string &label_r, unsigned current_r=0, unsigned total_r=0)
virtual unsigned termwidth() const
Width for formatted output [0==unlimited].
Maintain [min,max] and counter (value) for progress counting.
Out(TypeBit type, Verbosity verbosity=NORMAL)
virtual void dwnldProgressEnd(const zypp::Url &uri, long rate=-1, zypp::TriBool error=false)=0
Reports end of a download.
Write out a Table according to the layout.
zypp::DefaultIntegral< int,-1 > percentHint
static constexpr NoStartBar noStartBar
Indicator argument for ctor not drawing an initial start bar.
const std::string _indent
const unsigned _linewidth
desired line width
void noSend()
Set no ReceiverFnc.
ProgressEnd
ProgressBars default end tags.
TypeBit
Known output types implemented by derived classes.
void print()
Immediately print the progress bar not waiting for a new trigger.
void notePar(const Text &text_r, ParFormat format_r=ParFormat())
const char * qContinue()
translated "Continue?"
std::string get() const
Return plain line made of lhs + rhs.
TermLine(SplitFlags flags_r, char exp_r)
unsigned defaultTermwidth()
virtual void info(const std::string &msg, Verbosity verbosity=NORMAL, Type mask=TYPE_ALL)=0
Show an info message.
std::string numstring(char n, int w=0)
void info(std::string msg, const std::string &msg2, Verbosity verbosity=NORMAL, Type mask=TYPE_ALL)
void errorPar(size_t indent_r, const Text &text_r, ParFormat format_r=ParFormat())
Paragraph tagged with 'Error: '.
ListLayout(bool singleline_r, bool wrapline_r, bool gaped_r, unsigned indent_r)
Indicator type for ctor not drawing an initial start bar.
void print(const std::string &label_r)
Info(Out::Info &&rhs) noexcept
virtual void progressStart(const std::string &id, const std::string &label, bool is_tick=false)=0
Start of an operation with reported progress.
virtual bool progressFilter()
Determine whether to show progress.
std::ostream & operator<<(const Tp &val)
Only important messages (no progress or status, only the result).
void table(const std::string &nodeName_r, const std::string &title_r, const TContainer &container_r, const TFormater &formater_r=TFormater())
Write table from container creating a TitleNode with size="nnn" attribute and replacing optional %1% ...
std::string asXmlListElement(const std::string &val_r)
static constexpr Type TYPE_NONE
Verbosity
Verbosity levels.
std::string asListElement(const std::string &val_r)
void par(const Text &text_r, ParFormat format_r=ParFormat())
void xmlNode(const std::string &name_r, XmlNode::Attr attr_r)
unsigned defaultFormatWidth(unsigned desired_r=0) const
Terminal width or 150 if unlimited.
ColorString tagNote()
translated "Note:" highlighted
Base class for Exception.
ProgressBar(Out &out_r, NoStartBar, const std::string &label_r, unsigned current_r=0, unsigned total_r=0)
virtual void dwnldProgressStart(const zypp::Url &uri)=0
Reoprt start of a download.
ProgressBar(Out &out_r, NoStartBar, std::string progressId_r, const std::string &label_r, unsigned current_r=0, unsigned total_r=0)
Ctor not displaying an initial progress bar.
const TableLayout & _layout
void errorreset()
Reset any error condition.
virtual void progress(const std::string &id, const std::string &label, int value=-1)=0
Progress report for an on-going operation.
const ListLayout & _layout
ZYPP_DECLARE_FLAGS(SplitFlags, SplitFlag)
ZYPP_DECLARE_OPERATORS_FOR_FLAGS(TermLine::SplitFlags)
XML only: RAII writing a XML nodes start/end tag.
ProgressData::ReceiverFnc printing to a ProgressBar.
Convenience base class storing the back reference to Out.
value_type reportValue() const
const char * optBlankAfter(const std::string &str_r)
void printAndCount(const std::string &element_r) const
Write out a List according to the layout.
void gap()
NORMAL: An empty line.
void error(const std::string &label_r)
TitleNode(XmlNode &&node_r, const std::string &title_r="")
int report(Application &app_r) const
Default way of processing a caught Error exception.
TypeBit type() const
Return the type of the instance.
virtual void promptHelp(const PromptOptions &poptions)=0
Print help for prompt, if available.
virtual void searchResult(const Table &table_r)
Print out a search result.
void infoLR(const std::string &lmsg, const std::string &rmsg, Verbosity verbosity=NORMAL, Type mask=TYPE_ALL)
Info message, 2 strings L/R-adjusted.
std::string join(const Tltext <ext, const Trtext &rtext, const char *sep=" ")
Simple join of two string types.
bool _wrapline
fold lines longer than _linewidth
static std::string combine(std::string &&msg_r, const zypp::Exception &ex_r)
zypp::DefaultIntegral< char,' '> expHint
void progressEnd(const std::string &id, const std::string &label, bool error=false)
void operator<<(Tp &&val_r) const
void name(const std::string &name_r)
Set counter name.
void printRichText(std::string text, unsigned indent_r=0U)
int numDigits(unsigned num_r) const
void taggedPar(const TText &tag_r, const Text &text_r, ParFormat format_r=ParFormat())
void operator<<(Tp &&val_r) const
virtual bool mine(Type type)=0
Determine whether the output is intended for the particular type.
XmlNode(Out &out_r, const std::string &name_r, Attr attr_r)
Convenience ctor for one attribute pair.
~ProgressBar()
Dtor displays final progress bar.
std::string outLabel(const std::string &msg_r) const
bool reportPercent() const
virtual void error(const std::string &problem_desc, const std::string &hint="")=0
Show an error message and an optional hint.
void warningPar(size_t indent_r, const Text &text_r, ParFormat format_r=ParFormat())
Paragraph tagged with 'Warning: '.
virtual void prompt(PromptId id, const std::string &prompt, const PromptOptions &poptions, const std::string &startdesc="")=0
Prompt the user for a decision.
Writer(std::ostream &str_r, const TableLayout &layout_r, const TFormater &formater_r)
void list(const std::string &nodeName_r, const std::string &title_r, const TContainer &container_r, const TFormater &formater_r=TFormater())
Write list from container creating a TitleNode with size="nnn" attribute and replacing optional %1% i...
Class representing an application (appdata.xml)
const zypp::ProgressData * operator->() const
void warningPar(const Text &text_r, ParFormat format_r=ParFormat())
void container(const std::string &nodeName_r, const std::string &title_r, const TContainer &container_r, const TFormater &formater_r)
Write container creating a TitleNode with size="nnn" attribute and replacing optional %1% in title_r ...
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
ColorString tagWarning()
translated "Warning:" warning color