gonum.org/v1/gonum@v0.14.0/graph/formats/dot/dot.go (about)

     1  // This file is dual licensed under CC0 and The Gonum License.
     2  //
     3  // Copyright ©2017 The Gonum Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  //
     7  // Copyright ©2017 Robin Eklind.
     8  // This file is made available under a Creative Commons CC0 1.0
     9  // Universal Public Domain Dedication.
    10  
    11  //go:generate ./makeinternal.bash
    12  
    13  package dot
    14  
    15  import (
    16  	"fmt"
    17  	"io"
    18  	"os"
    19  
    20  	"gonum.org/v1/gonum/graph/formats/dot/ast"
    21  	"gonum.org/v1/gonum/graph/formats/dot/internal/lexer"
    22  	"gonum.org/v1/gonum/graph/formats/dot/internal/parser"
    23  )
    24  
    25  // ParseFile parses the given Graphviz DOT file into an AST.
    26  func ParseFile(path string) (*ast.File, error) {
    27  	buf, err := os.ReadFile(path)
    28  	if err != nil {
    29  		return nil, err
    30  	}
    31  	return ParseBytes(buf)
    32  }
    33  
    34  // Parse parses the given Graphviz DOT file into an AST, reading from r.
    35  func Parse(r io.Reader) (*ast.File, error) {
    36  	buf, err := io.ReadAll(r)
    37  	if err != nil {
    38  		return nil, err
    39  	}
    40  	return ParseBytes(buf)
    41  }
    42  
    43  // ParseBytes parses the given Graphviz DOT file into an AST, reading from b.
    44  func ParseBytes(b []byte) (*ast.File, error) {
    45  	l := lexer.NewLexer(b)
    46  	p := parser.NewParser()
    47  	file, err := p.Parse(l)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  	f, ok := file.(*ast.File)
    52  	if !ok {
    53  		return nil, fmt.Errorf("invalid file type; expected *ast.File, got %T", file)
    54  	}
    55  	if err := check(f); err != nil {
    56  		return nil, err
    57  	}
    58  	return f, nil
    59  }
    60  
    61  // ParseString parses the given Graphviz DOT file into an AST, reading from s.
    62  func ParseString(s string) (*ast.File, error) {
    63  	return ParseBytes([]byte(s))
    64  }