/*
 * Copyright (c) 2011 Google Inc.
 *
 * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
 * Public License v1.0 which accompanies this distribution, and is available at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 */
package com.google.eclipse.protobuf.model.util;

import static java.util.Collections.unmodifiableList;

import static com.google.common.collect.Lists.newArrayList;

import java.util.List;

import com.google.eclipse.protobuf.parser.UnknownSyntaxProtobuf;
import com.google.eclipse.protobuf.protobuf.Import;
import com.google.eclipse.protobuf.protobuf.Protobuf;
import com.google.eclipse.protobuf.protobuf.ProtobufElement;
import com.google.eclipse.protobuf.protobuf.PublicImport;
import com.google.inject.Singleton;

/**
 * Utility methods related to <code>{@link Protobuf}</code>s.
 *
 * @author alruiz@google.com (Alex Ruiz)
 */
@Singleton public class Protobufs {
  /**
   * Indicates whether the given root is not {@code null} and has a known syntax.
   *
   * @param protobuf the given root.
   * @return {@code true} if the given root is not {@code null} and has a syntax element,
   *         {@code false} otherwise.
   */
  public boolean hasKnownSyntax(Protobuf protobuf) {
    return protobuf != null && !(protobuf instanceof UnknownSyntaxProtobuf);
  }

  /**
   * Returns all the import definitions in the given root.
   * @param root the given root.
   * @return all the import definitions in the given root.
   */
  public List<Import> importsIn(Protobuf root) {
    List<Import> imports = newArrayList();
    for (ProtobufElement e : root.getElements()) {
      if (e instanceof Import) {
        imports.add((Import) e);
      }
    }
    return unmodifiableList(imports);
  }

  /**
   * Returns all the public import definitions in the given root.
   * @param root the given root.
   * @return all the public import definitions in the given root.
   */
  public List<Import> publicImportsIn(Protobuf root) {
    List<Import> imports = newArrayList();
    for (ProtobufElement e : root.getElements()) {
      if (e instanceof PublicImport) {
        imports.add((Import) e);
      }
    }
    return unmodifiableList(imports);
  }
}
