diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..cb13cbd --- /dev/null +++ b/action.yml @@ -0,0 +1,53 @@ +name: "Check formatting of Rust code with rustfmt" +description: | + Run `cargo fmt` and check Rust code. + Highlights places which are not correctly formatted. +branding: + icon: "check-square" + color: "yellow" + +runs: + using: composite + steps: + - name: "Install rustfmt Problem Matcher" + shell: bash + run: echo "::add-matcher::${{ github.action_path }}/rust.json" + - name: Rustfmt Job Summary + shell: bash + run: | + # Run cargo and store the original output + CARGO_STATUS=0 + CARGO_OUTPUT=$(cargo fmt --all -- --color=always --check 2>/dev/null) || CARGO_STATUS=$? + + if [ ${CARGO_STATUS} -eq 0 ]; then + cat <> $GITHUB_STEP_SUMMARY + # Rustfmt Results + + The code is formatted perfectly! + MARKDOWN_INTRO + else + cat <> $GITHUB_STEP_SUMMARY + # Rustfmt Results + + \`cargo fmt\` reported formatting errors in the following locations. + You can fix them by executing the following command and committing the changes. + \`\`\`bash + cargo fmt --all + \`\`\` + MARKDOWN_INTRO + + echo "${CARGO_OUTPUT}" | + # Strip color codes + sed 's/\x1B\[[0-9;]*[A-Za-z]//g' | + # Strip (some) cursor movements + sed 's/\x1B.[A-G]//g' | + tr "\n" "\r" | + # Wrap each location into a HTML details + sed -E 's#Diff in ([^\r]*?) at line ([[:digit:]]+):\r((:?[ +-][^\r]*\r)+)#
\n\1:\2\n\n```diff\n\3```\n\n
\n\n#g' | + tr "\r" "\n" >> $GITHUB_STEP_SUMMARY + fi + + # Print the original cargo message + echo "${CARGO_OUTPUT}" + # Exit with the same status as cargo + exit "${CARGO_STATUS}" diff --git a/rust.json b/rust.json new file mode 100644 index 0000000..ce3f51b --- /dev/null +++ b/rust.json @@ -0,0 +1,16 @@ +{ + "problemMatcher": [ + { + "owner": "rustfmt", + "severity": "warning", + "pattern": [ + { + "regexp": "^(Diff in (.+)) at line (\\d+):$", + "message": 1, + "file": 2, + "line": 3 + } + ] + } + ] +}