2020-03-18 22:32:31 +03:00
|
|
|
module ReadmeStartsWithProjectTitle exposing (rule)
|
|
|
|
|
|
|
|
import Elm.Package
|
|
|
|
import Elm.Project
|
2020-03-19 00:49:42 +03:00
|
|
|
import Elm.Syntax.Range exposing (Range)
|
2020-03-18 22:32:31 +03:00
|
|
|
import Review.Rule as Rule exposing (Error, Rule)
|
|
|
|
|
|
|
|
|
|
|
|
rule : Rule
|
|
|
|
rule =
|
|
|
|
Rule.newProjectRuleSchema "ReadmeStartsWithProjectTitle"
|
|
|
|
{ moduleVisitor = moduleVisitor
|
|
|
|
, initProjectContext = initProjectContext
|
|
|
|
, fromProjectToModule = fromProjectToModule
|
|
|
|
, fromModuleToProject = fromModuleToProject
|
|
|
|
, foldProjectContexts = foldProjectContexts
|
|
|
|
}
|
|
|
|
|> Rule.withElmJsonProjectVisitor elmJsonVisitor
|
2020-03-19 00:49:42 +03:00
|
|
|
|> Rule.withReadmeProjectVisitor readmeVisitor
|
2020-03-18 22:32:31 +03:00
|
|
|
|> Rule.fromProjectRuleSchema
|
|
|
|
|
|
|
|
|
|
|
|
moduleVisitor : Rule.ModuleRuleSchema {} ModuleContext -> Rule.ModuleRuleSchema { hasAtLeastOneVisitor : () } ModuleContext
|
|
|
|
moduleVisitor schema =
|
|
|
|
schema
|
|
|
|
|> Rule.withModuleDefinitionVisitor (\_ context -> ( [], context ))
|
|
|
|
|
|
|
|
|
|
|
|
type alias ProjectContext =
|
|
|
|
{ projectTitle : Maybe String
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
initProjectContext : ProjectContext
|
|
|
|
initProjectContext =
|
|
|
|
{ projectTitle = Nothing
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type alias ModuleContext =
|
|
|
|
ProjectContext
|
|
|
|
|
|
|
|
|
|
|
|
fromProjectToModule : Rule.ModuleKey -> a -> ProjectContext -> ModuleContext
|
|
|
|
fromProjectToModule _ _ projectContext =
|
|
|
|
projectContext
|
|
|
|
|
|
|
|
|
|
|
|
fromModuleToProject : Rule.ModuleKey -> a -> ModuleContext -> ProjectContext
|
|
|
|
fromModuleToProject _ _ moduleContext =
|
|
|
|
moduleContext
|
|
|
|
|
|
|
|
|
|
|
|
foldProjectContexts : ProjectContext -> ProjectContext -> ProjectContext
|
|
|
|
foldProjectContexts _ previousContext =
|
|
|
|
previousContext
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- elm.json VISITOR
|
|
|
|
|
|
|
|
|
2020-03-19 01:08:06 +03:00
|
|
|
elmJsonVisitor : Maybe { a | project : Elm.Project.Project } -> ProjectContext -> ( List nothing, ProjectContext )
|
2020-03-18 22:32:31 +03:00
|
|
|
elmJsonVisitor maybeProject projectContext =
|
|
|
|
case maybeProject |> Maybe.map .project of
|
|
|
|
Just (Elm.Project.Package pkg) ->
|
2020-03-19 01:08:06 +03:00
|
|
|
( [], { projectTitle = Just <| Elm.Package.toString pkg.name } )
|
2020-03-18 22:32:31 +03:00
|
|
|
|
|
|
|
_ ->
|
2020-03-19 01:08:06 +03:00
|
|
|
( [], projectContext )
|
2020-03-18 22:32:31 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- README VISITOR
|
|
|
|
|
|
|
|
|
2020-03-19 00:49:42 +03:00
|
|
|
readmeVisitor : Maybe { readmeKey : Rule.ReadmeKey, content : String } -> ProjectContext -> ( List Error, ProjectContext )
|
2020-03-18 22:32:31 +03:00
|
|
|
readmeVisitor maybeReadme context =
|
2020-03-19 00:49:42 +03:00
|
|
|
case ( maybeReadme, context.projectTitle ) of
|
|
|
|
( Just { readmeKey, content }, Just projectName ) ->
|
2020-03-19 01:25:17 +03:00
|
|
|
if not <| String.startsWith ("# " ++ projectName) content then
|
2020-03-19 00:49:42 +03:00
|
|
|
let
|
|
|
|
range : Range
|
|
|
|
range =
|
|
|
|
{ start = { row = 1, column = 1 }
|
|
|
|
, end =
|
|
|
|
{ row = 1
|
|
|
|
, column =
|
|
|
|
String.lines content
|
|
|
|
|> List.head
|
|
|
|
|> Maybe.withDefault ""
|
|
|
|
|> String.length
|
|
|
|
|> (+) 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
in
|
|
|
|
( [ Rule.errorForReadme readmeKey
|
|
|
|
{ message = "TODO"
|
|
|
|
, details = [ "TODO" ]
|
|
|
|
}
|
|
|
|
range
|
|
|
|
]
|
|
|
|
, context
|
|
|
|
)
|
|
|
|
|
|
|
|
else
|
|
|
|
( [], context )
|
2020-03-18 22:32:31 +03:00
|
|
|
|
2020-03-19 00:49:42 +03:00
|
|
|
_ ->
|
2020-03-18 22:32:31 +03:00
|
|
|
( [], context )
|