001    package org.hamcrest;
002    
003    import java.io.IOException;
004    
005    /**
006     * A {@link Description} that is stored as a string.
007     */
008    public class StringDescription extends BaseDescription {
009        private final Appendable out;
010    
011        public StringDescription() {
012            this(new StringBuilder());
013        }
014    
015        public StringDescription(Appendable out) {
016            this.out = out;
017        }
018        
019        /**
020         * Return the description of a {@link SelfDescribing} object as a String.
021         * 
022         * @param selfDescribing
023         *   The object to be described.
024         * @return
025         *   The description of the object.
026         */
027        public static String toString(SelfDescribing selfDescribing) {
028            return new StringDescription().appendDescriptionOf(selfDescribing).toString();
029        }
030    
031        /**
032         * Alias for {@link #toString(SelfDescribing)}.
033         */
034        public static String asString(SelfDescribing selfDescribing) {
035            return toString(selfDescribing);
036        }
037    
038        @Override
039        protected void append(String str) {
040            try {
041                out.append(str);
042            } catch (IOException e) {
043                throw new RuntimeException("Could not write description", e);
044            }
045        }
046    
047        @Override
048        protected void append(char c) {
049            try {
050                out.append(c);
051            } catch (IOException e) {
052                throw new RuntimeException("Could not write description", e);
053            }
054        }
055        
056        /**
057         * Returns the description as a string.
058         */
059        @Override
060        public String toString() {
061            return out.toString();
062        }
063    }