/*
 * Copyright 2018 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package java.io;

/**
 * Reads characters from a string.
 */
public class StringReader extends Reader {
  private final String text;
  private int position;

  /**
   * Constructs a reader which will read from the given string.
   */
  public StringReader(String text) {
    this.text = text;
  }

  @Override
  public void close() throws IOException { }

  /**
   * Reads up to the specified number of characters from the string.
   */
  @Override
  public int read(char[] buf, int off, int readLength) {
    if (position >= text.length()) {
      return -1;
    }
    int length = Math.min(text.length() - position, readLength);
    text.getChars(position, position + length, buf, off);
    position += length;
    return length;
  }
}
