| 672 | } |
| 673 | |
| 674 | bool StreamWriterBuilder::validate(Json::Value* invalid) const { |
| 675 | #ifdef JSONCPP_HAS_STRING_VIEW |
| 676 | static const auto& valid_keys = *new std::set<std::string_view> |
| 677 | #else |
| 678 | static const auto & valid_keys = *new std::set<StringContainer> |
| 679 | #endif |
| 680 | { |
| 681 | "indentation", |
| 682 | "commentStyle", |
| 683 | "enableYAMLCompatibility", |
| 684 | "dropNullPlaceholders", |
| 685 | "useSpecialFloats", |
| 686 | "emitUTF8", |
| 687 | "precision", |
| 688 | "precisionType", |
| 689 | }; |
| 690 | for (auto si = settings_.begin(); si != settings_.end(); ++si) { |
| 691 | auto key = si.name(); |
| 692 | if (valid_keys.count(key)) |
| 693 | continue; |
| 694 | if (invalid) |
| 695 | (*invalid)[key] = *si; |
| 696 | else |
| 697 | return false; |
| 698 | } |
| 699 | return invalid ? invalid->empty() : true; |
| 700 | } |
| 701 | |
| 702 | Value& StreamWriterBuilder::operator[](const StringContainer& key) { |
| 703 | return settings_[key]; |
| 704 | } |
| 705 | // static |
| 706 | void StreamWriterBuilder::setDefaults(Json::Value* settings) { |
| 707 | //! [StreamWriterBuilderDefaults] |
| 708 | (*settings)["commentStyle"] = "All"; |
| 709 | (*settings)["indentation"] = "\t"; |
| 710 | (*settings)["enableYAMLCompatibility"] = false; |
| 711 | (*settings)["dropNullPlaceholders"] = true; |
| 712 | (*settings)["useSpecialFloats"] = false; |
| 713 | (*settings)["emitUTF8"] = true; |
| 714 | (*settings)["precision"] = 17; |
| 715 | (*settings)["precisionType"] = "significant"; |
| 716 | //! [StreamWriterBuilderDefaults] |
| 717 | } |
| 718 | |
| 719 | StringContainer writeString(StreamWriter::Factory const& factory, Value const& root) { |
| 720 | OStringStream sout; |
| 721 | StreamWriterPtr const writer(factory.newStreamWriter()); |
| 722 | writer->write(root, &sout); |
| 723 | return std::move(sout).str(); |
| 724 | } |
| 725 | |
| 726 | OStream& operator<<(OStream& sout, Value const& root) { |
| 727 | StreamWriterBuilder builder; |
| 728 | StreamWriterPtr const writer(builder.newStreamWriter()); |
| 729 | writer->write(root, &sout); |
| 730 | return sout; |
| 731 | } |