1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|

[](https://pkg.go.dev/github.com/editorconfig/editorconfig-core-go/v2)
[](https://goreportcard.com/report/github.com/editorconfig/editorconfig-core-go)
# Editorconfig Core Go
A [Editorconfig][editorconfig] file parser and manipulator for Go.
## Missing features
- escaping comments in values, probably in [go-ini/ini](https://github.com/go-ini/ini)
- [adjacent nested braces](https://github.com/editorconfig/editorconfig-core-test/pull/44)
## Installing
We recommend the use of Go 1.17+ modules for this package. Lower versions, such as 1.13, should be fine.
Import by the same path. The package name you will use to access it is
`editorconfig`.
```go
import "github.com/editorconfig/editorconfig-core-go/v2"
```
## Usage
### Parse from a file
```go
fp, err := os.Open("path/to/.editorconfig")
if err != nil {
log.Fatal(err)
}
defer fp.Close()
editorConfig, err := editorconfig.Parse(fp)
if err != nil {
log.Fatal(err)
}
```
### Graceful parsing from a file
```go
fp, err := os.Open("path/to/.editorconfig")
if err != nil {
log.Fatal(err)
}
defer fp.Close()
editorConfig, warning, err := editorconfig.ParseGraceful(fp)
if err != nil {
log.Fatal(err)
}
// Log the warning(s) encountered while reading the editorconfig file
if warning != nil {
log.Print(warning)
}
```
### Parse from slice of bytes
```go
data := []byte("...")
editorConfig, err := editorconfig.ParseBytes(data)
if err != nil {
log.Fatal(err)
}
```
### Get definition to a given filename
This method builds a definition to a given filename.
This definition is a merge of the properties with selectors that matched the
given filename.
The lasts sections of the file have preference over the priors.
```go
def := editorConfig.GetDefinitionForFilename("my/file.go")
```
This definition have the following properties:
```go
type Definition struct {
Selector string
Charset string
IndentStyle string
IndentSize string
TabWidth int
EndOfLine string
TrimTrailingWhitespace *bool
InsertFinalNewline *bool
Raw map[string]string
}
```
#### Automatic search for `.editorconfig` files
If you want a definition of a file without having to manually
parse the `.editorconfig` files, you can then use the static version
of `GetDefinitionForFilename`:
```go
def, err := editorconfig.GetDefinitionForFilename("foo/bar/baz/my-file.go")
```
In the example above, the package will automatically search for
`.editorconfig` files on:
- `foo/bar/baz/.editorconfig`
- `foo/baz/.editorconfig`
- `foo/.editorconfig`
Until it reaches a file with `root = true` or the root of the filesystem.
### Generating a .editorconfig file
You can easily convert a Editorconfig struct to a compatible INI file:
```go
// serialize to slice of bytes
data, err := editorConfig.Serialize()
if err != nil {
log.Fatal(err)
}
// save directly to file
err := editorConfig.Save("path/to/.editorconfig")
if err != nil {
log.Fatal(err)
}
```
## Contributing
To run the tests:
```bash
go test -v ./...
```
To run the [integration tests](https://github.com/editorconfig/editorconfig-core-test):
```bash
make test-core
```
[editorconfig]: https://editorconfig.org/
|