code: func (c *adminClient) GetSchema() ([]*EntityDefinition, error) {
  	// prevent bogus scope names from reaching connectors
  	if err := IsValidName(c.scope); err != nil {
  		return nil, errors.Wrapf(err, "invalid scope name %q", c.scope)
  	}
  	// "warnings" mean entity was found but contained invalid annotations
  	entities, warns, err := findEntities(c.dirs, c.excludes)
  	if len(warns) > 0 {
  		return nil, NewEntityErrors(warns)
  	}
  	// I/O and AST parsing errors
  	if err != nil {
  		return nil, err
  	}
  	// prevent unnecessary connector calls when nothing was found
  	if len(entities) == 0 {
  		return nil, fmt.Errorf("no entities found; did you specify the right directories for your source?")
  	}
  
  	defs := make([]*EntityDefinition, len(entities))
  	for idx, e := range entities {
  		defs[idx] = &e.EntityDefinition
  	}
  	return defs, nil
  }
docs: // GetSchema returns the derived entity definitions that are found within the
  // current search path of the client. GetSchema can be used to introspect the
  // state of schema before further operations are performed. For example,
  // GetSchema is called by both CheckSchema and UpsertSchema before their
  // respective operations are performed. An error is returned when:
  //   - invalid scope name (eg. length, invalid characters, see names.go)
  //   - invalid directory (eg. path does not exist, is not a directory)
  //   - unparseable entity (eg. invalid primary key)
  //   - no entities were found